在 array_filter 中使用外部变量

Posted

技术标签:

【中文标题】在 array_filter 中使用外部变量【英文标题】:Use external variable in array_filter 【发布时间】:2014-11-17 14:39:24 【问题描述】:

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

$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。

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

【问题讨论】:

什么是$bar,$bar的价值是什么 @NitishKumar $bar 通常是一个数组 @php-dev 我们可以说它绝对是一个数组,因为它不会抛出 PHP 错误。它可能不总是绝对是一个数组,具体取决于代码,但它绝对是一个用例中的数组,他得到了 OP 中描述的错误 对不起,确实是有ID的数组。 【参考方案1】:

变量$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;
);

【讨论】:

注意: 需要 PHP 5.3.x ... 另请参阅 ***.com/a/25994339/42223 @dreftymac 5.3 仅用于匿名函数语法,它不特定于 use 修饰符。【参考方案2】:

变量范围问题!

简单的解决方法是:

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

希望对你有帮助

【讨论】:

我认为第一个版本不会在 5.3 之前运行,因为匿名函数是在 5.3 中添加的。之前,您必须使用 create_function() 函数以及 global 声明。【参考方案3】:

因为你的闭包函数看不到$id。您需要use 关键字:

$foo = array_filter($bar, function($obj) use ($id) 

【讨论】:

以上是关于在 array_filter 中使用外部变量的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何使用 array_filter() 过滤数组键?

array_filter函数使用

array_filter函数使用

PHP 数组过滤空值 array_filter

在array_filter()之后,我如何重置键以从0开始按数字顺序排列

PHP array_filter() 函数详解