在 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() 过滤数组键?