带有参数的PHP数组过滤器

带有参数的PHP数组过滤器,php,arrays,Php,Arrays,我有以下代码: function lower_than_10($i) { return ($i < 10); } 如何将参数添加到低于10的值,以便它也接受要检查的数字?比如,如果我有这个: function lower_than($i, $num) { return ($i < $num); } 函数低于($i,$num){ 回报($i12)),我不是php高手,所以这可能是一个显而易见的问题,但如何将数组传递给Array\u过滤器并使其工作?文档中除了有人的评

我有以下代码:

function lower_than_10($i) {
    return ($i < 10);
}
如何将参数添加到低于10的值,以便它也接受要检查的数字?比如,如果我有这个:

function lower_than($i, $num) {
    return ($i < $num);
}
函数低于($i,$num){
回报($i<$num);
}

如何从数组中调用它\u过滤器将10传递到$num或任何数字?

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

函数创建低于($number=10){
//此处的“use”在声明时将$number绑定到函数。
//这意味着每当$number出现在匿名
//函数,它将具有匿名
//函数已声明。
返回函数($test)使用($number){return$test<$number;};
}
//默认情况下,我们创建了一个10。让我们测试一下。
$lt_10=创建低于()的值;
var_dump($lt_10(9));//真的
变量转储($lt_10(10));//假的
变量转储($lt_10(11));//假的
//让我们尝试一个特定的值。
$lt\u 15=创建低于(15)的值;
var_dump($lt_15(13));//真的
var_dump($lt_15(14));//真的
var_dump($lt_15(15));//假的
变量转储($lt_15(16));//假的
//15岁以下儿童的诞生并没有打乱我们的10岁以下儿童:
var_dump($lt_10(9));//仍然正确
变量转储($lt_10(10));//还是假的
变量转储($lt_10(11));//还是假的
//我们只需将匿名函数传递到
//应为“callback”PHP类型,例如在数组_筛选器中:
$arr=数组(7,8,9,10,11,12,13);
$new\u arr=阵列过滤器($arr,$lt\u 10);
打印(新的);

作为@Charles的替代方案,您可以在文档页面上找到一个示例其思想是创建一个具有所需状态(
$num
)和回调方法(以
$i
为参数)的对象:

class LowerThanFilter {
        private $num;

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

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

作为旁注,您现在可以使用更通用的
数值比较过滤器
替换
较低的过滤器
,使用
isLower
isGreater
isEqual
等方法。只需一个想法和扩展中的一个…

就可以通过使用magic方法增加一些魔力

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

如果您使用php 5.3及更高版本,可以使用来简化代码:

$NUM = 5;
$items = array(1, 4, 5, 8, 0, 6);
$filteredItems = array_filter($items, function($elem) use($NUM){
    return $elem < $NUM;
});
$NUM=5;
$items=数组(1,4,5,8,0,6);
$filteredItems=array\u filter($items,function($elem)use($NUM){
返回$elem<$NUM;
});

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


感谢您提供的解决方案,它很简洁,但我在服务器上安装了PHP5.2,因此我必须使用jensgram的:)在php<5.3中,您可以使用
create_function()
create_function()
基本上是
eval()
的另一个名称,而且同样邪恶。应该不鼓励使用它。在接受的答案中给出的古怪的基于类的解决方案比在这种情况下使用
create\u function()
更好。很好的解决方案。为了便于维护代码,修改类以支持更可读的方法调用可能会有所帮助:$matches=$myobj->ArraySelect(Array('from'=>$arr',where'=>$foo,'lessthan'=>12)),我不是php高手,所以这可能是一个显而易见的问题,但如何将数组传递给Array\u过滤器并使其工作?文档中除了有人的评论外,从来没有提到过这一点。@NicolaPedretti我想你说的是
array\u filter
的seconds参数吧?它只是一个
可调用的
;在上面匹配“类型3:对象方法调用”的情况下:
array(,)
,cf。我确实觉得很讨厌。直接传递方法似乎更直观。@nicolapedretti我已经好几年没有接触过PHP了。到现在为止,我觉得大部分内容都很粗糙:)不知道可以使用
use
这个词为lambda提供额外的参数。谢谢你这么有价值的提示!:)我认为这是最好的解决办法。这很简单,切中要害。遗憾的是,PHP不允许匿名函数使用父作用域中声明的变量,如javascript。有用、优雅、简短、+1我认为这应该是公认的解决方案,因为它是唯一一个回答“如何向数组\过滤器添加参数”问题的解决方案。其他的答案是提供相同结果的替代路径,使用闭包或类。谢谢你,伙计。完美的
$arr = array(7, 8, 9, 10, 11, 12, 13);
$matches = array_filter($arr, array(new LowerThanFilter(12), 'isLower'));
print_r($matches);
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')) );
$NUM = 5;
$items = array(1, 4, 5, 8, 0, 6);
$filteredItems = array_filter($items, function($elem) use($NUM){
    return $elem < $NUM;
});
$r = array_filter($anArray, function($anElement) use ($a, $b, $c){
    //function body where you may use $anElement, $a, $b and $c
});