PHP array_filter中的未定义变量

时间:2015-09-01 04:47:11

标签: php array-filter

这可能是一个非常愚蠢的问题,但我无法理解PHP范围如何处理这段代码:

$leagueKey = 'NFL';
$response['response'] = array_filter($response['response'], function($tier){
    return ($tier['LeagueKey'] === $leagueKey ? true : false);
});

当我运行时,我得到一个"未定义的变量:leagueKey"例外。另一方面,这非常有效:

$response['response'] = array_filter($response['response'], function($tier){
    return ($tier['LeagueKey'] === 'NFL' ? true : false);
});

为什么PHP不能在array_filter函数中看到我的$ leagueKey变量?

谢谢!

4 个答案:

答案 0 :(得分:20)

您的$leagueKey变量超出了匿名函数(闭包)的范围。幸运的是,PHP提供了一种将变量放入范围的非常简单的方法 - use关键字。尝试:

$leagueKey = 'NFL';
$response['response'] = array_filter($response['response'], function($tier) use ($leagueKey) {
    return $tier['LeagueKey'] === $leagueKey;
});

这只是告诉你的匿名函数“使用”当前范围内的$leagueKey变量。

答案 1 :(得分:4)

试试这个

$response['response'] = array_filter($response['response'], function($tier) use ($leagueKey) {
 return ($tier['LeagueKey'] === $leagueKey ? true : false); 
}); 

答案 2 :(得分:2)

这是所有变量的范围如何工作。你的匿名函数对它之外的变量一无所知。这适用于所有类型的函数:如果需要使用函数外部的变量 - 将其传递给函数。在这种情况下,您无法传递任何内容,但如果您运行PHP5.3 +,则可以执行此操作 function($tier) use ($leagueKey){ 这将告诉函数它需要使用在其外定义的$ leagueKey。如果你的php低于5.3你将不得不使用像这样的解决方法: http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html

答案 3 :(得分:-4)

尝试全局可变:

$GLOBALS['leagueKey'] = 'NFL';
$response['response'] = array_filter($response['response'], function($tier){
    return ($tier['LeagueKey'] === $leagueKey ? true : false);
});