在array_filter中使用外部变量

问题描述 投票:0回答:3

我有一个数组,我想通过外部变量对其进行过滤。 情况如下:

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

第一个

var_dump
返回ID(当然是动态设置的),但是,第二个
var_dump
返回NULL。

谁能告诉我原因以及如何解决?

php scope array-filter
3个回答
177
投票

变量

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

请参阅匿名函数的文档(示例#3“从父作用域继承变量”)。


13
投票

变量范围问题!

简单的修复方法是:

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

或者,从 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;
});

希望有帮助


9
投票

因为你的闭包函数看不到

$id
。您需要
use
关键字:

$foo = array_filter($bar, function($obj) use ($id) {
© www.soinside.com 2019 - 2024. All rights reserved.