使用array_walk与箭头函数时,如何正确引用变量实现累加计数?
正确累加$email_actions值的解决方案
问题原因
你之前的写法存在两个核心问题:
- 箭头函数默认按值传递捕获外部变量,无法直接修改外部的
$email_actions; - 尝试传引用时参数顺序错误,
array_walk的回调函数默认参数是($元素, $键),额外参数需要通过array_walk的第三个参数传入,而非直接写在回调参数里。
解决方案一:普通匿名函数+引用捕获
修改回调为普通匿名函数,通过use(&$email_actions)显式捕获变量引用,确保内部修改能同步到外部:
$email_actions = 0; array_walk( $steps, function($step) use(&$email_actions) { if (!empty($step['settings']['type']) && $step['settings']['type'] === self::FLOWS_EMAIL_TYPE_ACTION) { $email_actions++; } } ); dd($email_actions);
解决方案二:用array_reduce贴合统计语义
统计数组中符合条件的元素数量,array_reduce是更合适的工具,无需依赖引用传递,逻辑更清晰:
$email_actions = array_reduce( $steps, function($carry, $step) { return (!empty($step['settings']['type']) && $step['settings']['type'] === self::FLOWS_EMAIL_TYPE_ACTION) ? $carry + 1 : $carry; }, 0 // 初始累加值 ); dd($email_actions);
补充:箭头函数的可行写法(不推荐)
如果坚持要用箭头函数,可通过显式引用捕获实现,但可读性不如前两种方案:
$email_actions = 0; array_walk( $steps, fn($step) use(&$email_actions) => !empty($step['settings']['type']) && $step['settings']['type'] === self::FLOWS_EMAIL_TYPE_ACTION ? $email_actions++ : null ); dd($email_actions);
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

