【问题标题】:Use external variable in array_filter在 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的数组。

标签: php scope array-filter


【解决方案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;
});

【讨论】:

【解决方案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) {

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2014-03-01
    • 2012-07-20
    • 2017-05-26
    相关资源
    最近更新 更多