You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用array_walk与箭头函数时,如何正确引用变量实现累加计数?

正确累加$email_actions值的解决方案

问题原因

你之前的写法存在两个核心问题:

  1. 箭头函数默认按值传递捕获外部变量,无法直接修改外部的$email_actions;
  2. 尝试传引用时参数顺序错误,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:45:38