这可能是一个非常愚蠢的问题,但我无法理解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变量?
谢谢!
答案 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);
});