only - php array_filter trim




Array_filter PHP con argomenti (4)

Ho il codice seguente:

function lower_than_10($i) {
    return ($i < 10);
}

che posso usare per filtrare un array come questo:

$arr = array(7, 8, 9, 10, 11, 12, 13);
$new_arr = array_filter($arr, 'lower_than_10');

Come posso aggiungere argomenti a lower_than_10 in modo che accetti anche il numero da verificare? Ad esempio, se ho questo:

function lower_than($i, $num) {
    return ($i < $num);
}

come chiamarlo da array_filter passando da 10 a $ num o qualunque numero?


In PHP 5.3 o versione successiva, puoi utilizzare una closure :

function create_lower_than($number = 10) {
// The "use" here binds $number to the function at declare time.
// This means that whenever $number appears inside the anonymous
// function, it will have the value it had when the anonymous
// function was declared.
    return function($test) use($number) { return $test < $number; };
}

// We created this with a ten by default.  Let's test.
$lt_10 = create_lower_than();
var_dump($lt_10(9)); // True
var_dump($lt_10(10)); // False
var_dump($lt_10(11)); // False

// Let's try a specific value.
$lt_15 = create_lower_than(15);
var_dump($lt_15(13)); // True
var_dump($lt_15(14)); // True
var_dump($lt_15(15)); // False
var_dump($lt_15(16)); // False

// The creation of the less-than-15 hasn't disrupted our less-than-10:
var_dump($lt_10(9)); // Still true
var_dump($lt_10(10)); // Still false
var_dump($lt_10(11)); // Still false

// We can simply pass the anonymous function anywhere that a
// 'callback' PHP type is expected, such as in array_filter:
$arr = array(7, 8, 9, 10, 11, 12, 13);
$new_arr = array_filter($arr, $lt_10);
print_r($new_arr);

In alternativa alla soluzione di @ Charles che utilizza le chiusure , puoi effettivamente trovare un esempio nei commenti sulla pagina della documentazione. L'idea è di creare un oggetto con lo stato desiderato ( $num ) e il metodo di callback (prendendo $i come argomento):

class LowerThanFilter {
        private $num;

        function __construct($num) {
                $this->num = $num;
        }

        function isLower($i) {
                return $i < $this->num;
        }
}

Utilizzo ( demo ):

$arr = array(7, 8, 9, 10, 11, 12, 13);
$matches = array_filter($arr, array(new LowerThanFilter(12), 'isLower'));
print_r($matches);

Come sidenote, ora puoi sostituire LowerThanFilter con un più generico NumericComparisonFilter con metodi come isLower , isGreater , isEqual ecc. Solo un pensiero - e una demo ...


se hai bisogno di più parametri da passare alla funzione, puoi aggiungerli all'istruzione use usando ",":

$r = array_filter($anArray, function($anElement) use ($a, $b, $c){
    //function body where you may use $anElement, $a, $b and $c
});

se utilizzi php 5.3 e versioni successive, puoi utilizzare la closure per semplificare il codice:

$NUM = 5;
$items = array(1, 4, 5, 8, 0, 6);
$filteredItems = array_filter($items, function($elem) use($NUM){
    return $elem < $NUM;
});




arrays