如何在带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; ?>
代码说明
- 移除静态/全局变量:递归函数内部初始化
$sum,每次递归返回当前节点下所有子节点的利润总和,上层函数直接累加该返回值。 - 正确处理递归返回:遍历子节点时,既累加当前子节点的利润,也加上该子节点所有后代的利润(通过递归调用获取)。
- 空值判断优化:用
!empty()替代== null,更严谨地判断子节点是否存在。 - 明确返回结果:
calculateUserProfit直接返回递归函数的结果,方便获取最终总和。
测试结果
针对你提供的$DATA_ARRAY,计算过程如下:
- 节点1的子节点是2和5:
- 节点5无后代,贡献
$LEVELS_PROFIT[0] = 30 - 节点2的子节点是3和4:
- 节点3无后代,贡献30
- 节点4无后代,贡献30
- 节点2总贡献:30(自身)+30+30=90
- 节点5无后代,贡献
- 总利润=30(节点5)+90(节点2)=120
运行代码后会输出总利润:120,符合预期。
内容的提问来源于stack exchange,提问作者mikael khalil
相关产品推荐
相关产品推荐

