PHP数组过滤器中出现未定义的变量

10

这可能是一个非常愚蠢的问题,但我就是无法理解这段代码中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变量?

谢谢!


2
因为 $leagueKey 是在该函数之外定义的。为了使用它,您可以在匿名函数内部使用 global $leagueKey,但这并不是最好的方法。 - ElefantPhace
因为它超出了范围,就像任何函数一样,您必须将外部参数传递给它。 $leagueKey在函数之外,而字符串'NFL'在函数内,所以它可以工作。 - Rasclatt
尝试这个:$response['response'] = array_filter($response['response'], function($tier) use $leagueKey { return ($tier['LeagueKey'] === $leagueKey ? true : false); }); - Ganesh Ghalame
不应被标记为重复... 这是一个好问题,与其他问题不同,只是答案类似。 - Andrew
4个回答

36

你的$leagueKey变量位于匿名函数(闭包)的作用域之外。幸运的是,PHP提供了一个非常简单的方法将变量带入作用域——使用use关键字。尝试:

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

这只是告诉你的匿名函数要从当前作用域中“使用”$leagueKey变量。

编辑

令人兴奋的PHP 7.4更新 - 我们现在可以使用“短闭包”编写不具有自己作用域的函数。例如,可以在PHP 7.4中像这样编写:

$response['response'] = array_filter(
    $response['response'], 
    fn($tier) => $tier['LeagueKey'] === $leagueKey
);

5

试试这个

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

1
你缺少括号,use ($leagueKey) - Sverri M. Olsen
@Sverri M. Olsen 谢谢,没有括号是行不通的。 - Ganesh Ghalame

2
这是所有变量作用域的工作方式。你的匿名函数对其外部变量一无所知。这适用于所有类型的函数:如果你需要使用一个在函数之外的变量,你需要将它传递给该函数。在这种情况下,你不能传递任何东西,但如果你运行的是PHP5.3+,你可以这样做: function($tier) use ($leagueKey){ 这将告诉函数它需要使用在其外部定义的$leagueKey。如果你的php版本低于5.3,你将不得不使用类似于这个的解决方法: 链接

-4

尝试使用全局变量:

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

使用全局变量不是一个好的实践,查看此链接以获得澄清:https://dev59.com/h3I_5IYBdhLWcg3wBuX3 - Ganesh Ghalame

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接