【问题标题】:Callback function using variables calculated outside of it使用在其外部计算的变量的回调函数
【发布时间】:2011-06-03 02:07:29
【问题描述】:

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

$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);

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

【问题讨论】:

    标签: php anonymous-function


    【解决方案1】:

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

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

    有关详细信息,请参阅anonymous functions 上的手册页。

    如果您运行的是 PHP 7.4 或更高版本,则可以使用 arrow functions。箭头函数是定义匿名函数的另一种更简洁的方法,它自动捕获外部变量,无需use

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

    鉴于箭头函数非常简洁,您可以合理地将它们直接写在array_filter 调用中:

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

    【讨论】:

    • 非常感谢 mfonda,我查看了手册页,但错过了代码示例中的关键字。
    • 你拯救了我的一天!简单实用
    • 只是添加到上述答案中,父范围变量正在被复制,而不是在回调函数中可用。如果需要操作父参数,则应该像这样发送引用$listOfValLessThanAvg = []; $callback = function($val) use ($avg, &amp;$listOfValLessThanAvg) { if( $val &lt; $avg) array_push($listOfValLessThanAvg, $val); };
    • 绞尽脑汁想怎么做。首先想到的是$GLOBALS,但显然这是不行的。遇到了这个答案。字面上完美。
    【解决方案2】:

    使用全局变量,即 $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);
    

    【讨论】:

    • 全局变量被认为是不好的做法。此外,在这里使用全局变量是多余的,因为use 就足够了。
    • 全局变量是邪恶的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2018-05-27
    • 2012-07-14
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多