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

如何在带foreach循环的PHP递归函数中返回计算总和

问题描述

我需要遍历树形结构数组,为每个子节点累加$LEVELS_PROFIT数组对应level的数值,最终返回累计总和。但使用foreach循环时,return操作会中断循环,无法完成全遍历;用全局变量虽然能遍历但不符合编程规范,而且没法正确返回结果。

现有代码

<?php 
     $ENTRY_PRICE = 100;
     $LEVELS_PROFIT = array(30,20,10,5,2.5,6,9);
         
     function RecursiveProfit($parent,$level) {
        static  $sumProfit;
        global $LEVELS_PROFIT;

        echo($parent['firstName'] ." ".  $sumProfit. " </br>" );
        if ($parent['children'] == null) return;

        foreach($parent['children'] as $child) {
            $sumProfit += $LEVELS_PROFIT[$level];
             RecursiveProfit($child,0); 
        }

       
    }
    
     function calculateUserProfit($userArray) {    
         RecursiveProfit($userArray,0);
    }
?>

已尝试的方法

  • 添加return语句,但会中断foreach循环
  • 使用全局变量并检查是否已初始化

树形数组结构

$DATA_ARRAY = array([
    'id'=> 1,
    'firstName'=> "Random1",
    'lastName'=> "Random2",
    'level'=> 0,
        'children'=> 
            
                    array([
                    'id'=> 2,
                    'firstName'=> "Random3",
                    'lastName'=> "Random4",
                    'level'=> 0,
                                'children'=> array([
                                    'id'=> 3,
                                    'firstName'=> "Random5",
                                    'lastName'=> "Random6",
                                    'level'=> 0,
                                    'children'=> null
                                ],[
                                    'id'=> 4,
                                    'firstName'=> "Random7",
                                    'lastName'=> "Random8",
                                    'level'=> 0,
                                    'children'=> null
                                    ])
                        ],
        
                    [
                    'id'=> 5,
                    'firstName'=> "Random12",
                    'lastName'=> "Random13",
                    'level'=> 0,
                    'children'=> null
                    ]) 
    
            ])

解决方案

核心问题在于你用static变量存储总和,且递归函数未返回累加值,也没正确处理子节点的递归结果。下面是优化后的代码,完全避免全局/静态变量,用递归返回值累加总和:

<?php 
$ENTRY_PRICE = 100;
$LEVELS_PROFIT = array(30,20,10,5,2.5,6,9);

// 递归计算利润总和
function RecursiveProfit($parent, $level) {
    global $LEVELS_PROFIT;
    $sum = 0;

    // 若当前节点有子节点,逐个处理
    if (!empty($parent['children'])) {
        foreach($parent['children'] as $child) {
            // 累加当前子节点的level利润,再加上子节点后代的利润
            $sum += $LEVELS_PROFIT[$level] + RecursiveProfit($child, 0);
        }
    }

    return $sum;
}

function calculateUserProfit($userArray) {    
    return RecursiveProfit($userArray, 0);
}

// 测试调用
$totalProfit = calculateUserProfit($DATA_ARRAY[0]);
echo "总利润:" . $totalProfit;
?>

代码说明

  1. 移除静态/全局变量:递归函数内部初始化$sum,每次递归返回当前节点下所有子节点的利润总和,上层函数直接累加该返回值。
  2. 正确处理递归返回:遍历子节点时,既累加当前子节点的利润,也加上该子节点所有后代的利润(通过递归调用获取)。
  3. 空值判断优化:用!empty()替代== null,更严谨地判断子节点是否存在。
  4. 明确返回结果:calculateUserProfit直接返回递归函数的结果,方便获取最终总和。

测试结果

针对你提供的$DATA_ARRAY,计算过程如下:

  • 节点1的子节点是2和5:
    • 节点5无后代,贡献$LEVELS_PROFIT[0] = 30
    • 节点2的子节点是3和4:
      • 节点3无后代,贡献30
      • 节点4无后代,贡献30
      • 节点2总贡献:30(自身)+30+30=90
  • 总利润=30(节点5)+90(节点2)=120

运行代码后会输出总利润:120,符合预期。

内容的提问来源于stack exchange,提问作者mikael khalil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:15:29