在array_filter中使用外部变量

San*_*ood 38 php scope array-filter

我有一个数组,我希望通过外部变量进行过滤.情况如下:

$id = '1';
var_dump($id);
$foo = array_filter($bar, function($obj){
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
});
Run Code Online (Sandbox Code Playgroud)

第一个var_dump返回ID(动态设置为ofcourse),但第二个var_dump返回NULL.

谁能告诉我为什么,以及如何解决它?

Bar*_*mar 81

变量$id不在函数范围内.您需要使用该use子句来访问外部变量:

$foo = array_filter($bar, function($obj) use ($id) {
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
});
Run Code Online (Sandbox Code Playgroud)


php*_*dev 6

可变范围问题!

简单的解决方法是:

$id = '1';
var_dump($id);
$foo = array_filter($bar, function($obj){
    global $id;
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
}); 
Run Code Online (Sandbox Code Playgroud)

或者,自PHP 5.3起

$id = '1';
var_dump($id);
$foo = array_filter($bar, function($obj) use ($id) {
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
});
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你


Joe*_*Joe 5

因为你的闭包功能看不到$id.你需要use关键字:

$foo = array_filter($bar, function($obj) use ($id) {
Run Code Online (Sandbox Code Playgroud)