使用在外部计算的变量的回调函数

72

基本上我想做类似这样的事情:

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$avg = array_sum($arr) / count($arr);
$callback = function($val){ return $val < $avg };

return array_filter($arr, $callback);

这真的可能吗?在匿名函数外计算一个变量并在函数内使用它?

2个回答

177

您可以使用use关键字从父作用域继承变量。在您的示例中,您可以执行以下操作:

$callback = function($val) use ($avg) { return $val < $avg; };

了解更多信息,请查看匿名函数的手册页面。

如果您正在运行PHP 7.4或更高版本,则可以使用箭头函数。箭头函数是定义匿名函数的另一种更简洁的方式,它自动捕获外部变量,消除了对use的需要:

$callback = fn($val) => $val < $avg;

考虑到箭头函数的简洁性,你可以合理地将它们直接写在 array_filter 调用中:

return array_filter($arr, fn($val) => $val < $avg);

非常感谢mfonda,我看了手册页面,但在代码示例中错过了那个关键字。 - Breno Gazzola
21
иЎҘе……дёҠйқўзҡ„зӯ”жЎҲпјҢзҲ¶зә§дҪңз”ЁеҹҹеҸҳйҮҸиў«еӨҚеҲ¶иҖҢдёҚжҳҜиў«дј йҖ’еҲ°еӣһи°ғеҮҪж•°дёӯгҖӮеҰӮжһңйңҖиҰҒж“ҚдҪңзҲ¶зә§еҸӮж•°пјҢеҲҷеә”иҜҘеҸ‘йҖҒдёҖдёӘеј•з”ЁпјҢеҰӮдёӢжүҖзӨәпјҡ$listOfValLessThanAvg = []; $callback = function($val) use ($avg, &$listOfValLessThanAvg) { if( $val < $avg) array_push($listOfValLessThanAvg, $val); }; - pravin
绞尽脑汁想怎么做这件事情。第一个想法是 $GLOBALS,但显然不行。看到了这个答案。简直完美。 - JustCarty
就内存而言,哪个更有效率?我记得在JavaScript中,箭头函数会在每次调用时实例化,而匿名函数则只创建一次并在每次迭代/调用时重新调用,大概是这样的,这意味着箭头函数虽然更实用但不太高效。PHP也是这种情况吗?我觉得我应该把这个问题单独发布,尽管我不认为在PHP中会出现这种情况。 - Clockwork

-7

使用全局变量,例如$GLOBAL ['avg']

$arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
$GLOBALS['avg'] = array_sum($arr) / count($arr);
$callback = function($val){ return $val < $GLOBALS['avg'] };

$return array_filter($arr, $callback);

8
全局变量被认为是不良实践。此外,在这里使用全局变量是过度的,因为use足以满足需求。 - Eduard Sukharev
3
全局变量很危险! - Thomas Wiersema

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