带参数的 PHP array_filter

我有以下密码:

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

我可以用它来过滤像这样的数组:

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

如何向 low _ than _ 10添加参数,以便它也接受要检查的数字?比如,如果我有这个:

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

如何从 array _ filter 传递10到 $num 或其他数字来调用它?

99593 次浏览

在 PHP 5.3或更高版本中,您可以使用 了结:

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);

作为@Charles 的 使用闭包的解决方案的替代品,实际上您可以在文档页面上找到一个示例 在评论中

class LowerThanFilter {
private $num;


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


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

使用方法(小样) :

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

作为旁注,您现在可以使用诸如 isLowerisGreaterisEqual等方法将 LowerThanFilter替换为更通用的 NumericComparisonFilter。只是一个想法和一个 小样..。

在扩展到 Jensgram的答案,您可以添加一些更神奇的使用 __invoke()神奇的方法。

class LowerThanFilter {
private $num;


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


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


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

这将允许你做

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


const OPERATOR_EQUALS = '==';
const OPERATOR_GREATERTHAN = '>';
const OPERATOR_LOWERTHAN = '<';
const OPERATOR_NOT = '!=';


private $_field;
private $_operation;
private $_val;


public function __construct($field,$operation,$num) {
$this->_field = $field;
$this->_operation = $operation;
$this->_val = $num;
}




function __invoke($i) {
switch($this->_operation){
case '==':
return $i[$this->_field] == $this->_val;
break;


case '>':
return $i[$this->_field] > $this->_val;
break;


case '<':
return $i[$this->_field] < $this->_val;
break;


case '!=':
return $i[$this->_field] != $this->_val;
break;
}
}




}

这允许您过滤多维数组中的项:

$users = array();
$users[] = array('email' => 'user1@email.com','name' => 'Robert');
$users[] = array('email' => 'user2@email.com','name' => 'Carl');
$users[] = array('email' => 'user3@email.com','name' => 'Robert');


//Print all users called 'Robert'
print_r( array_filter($users, new ArraySearcher('name',ArraySearcher::OPERATOR_EQUALS,'Robert')) );

如果您使用的是 php 5.3及以上版本,则可以使用 了结来简化代码:

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

如果需要向函数传递多个参数,可以使用“ ,”将它们附加到 use 语句:

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

值得注意的是,由于 PHP 7.4 箭头函数是可用的,这可以做得更加巧妙:

$max = 10;
$arr = array(7, 8, 9, 10, 11, 12, 13);
$new_arr = array_filter($arr, fn ($n) => $n < $max);