如何对父子层级关联的PHP数组实现父级累加子项计数求和
实现方案
你之前得到错误结果大概率是遍历逻辑的问题,比如在遍历过程中修改了原始值导致重复累加,或者父级节点匹配逻辑有误。可以按以下逻辑实现需求:
核心思路
- 先保留原始数组的初始值作为累加基数,单独复制一份数组存储最终计算结果,避免遍历过程中修改原始值干扰计算
- 对每个节点,按照「子键前缀为父键」的父子规则,逐层向上查找所有存在于数组中的父级节点
- 将当前节点的计数累加到所有匹配到的父级节点的最终结果中
实现代码
// 原始数组 $foo_array = [ 3533 => 4, 353 => 3, 351 => 2, 35 => 0, ]; // 复制原始数组作为结果数组的初始值 $result = $foo_array; foreach ($foo_array as $key => $value) { // 逐层生成父级候选键 $parent_key = substr($key, 0, -1); while ($parent_key !== '') { // 强转为int避免PHP数字键和字符串键匹配异常 $parent_key = (int)$parent_key; // 父级存在则累加当前节点的计数 if (isset($result[$parent_key])) { $result[$parent_key] += $value; } // 继续查找更上层的父级 $parent_key = substr($parent_key, 0, -1); } } // 输出验证结果 print_r($result);
输出结果
运行代码后最终得到的$result值为:
Array ( [3533] => 4 [353] => 7 [351] => 2 [35] => 9 )
完全符合你要求的键35最终计数为9的预期。
注意事项
- 如果你的实际业务中父子关联规则不是「子键前缀为父键」,只需要修改父级查找的逻辑即可,整体累加逻辑不需要调整
- 如果你的数组键本身是字符串类型,可以去掉父级键强转int的那行代码,避免匹配异常
内容的提问来源于stack exchange,提问作者سبحان مقیسه
相关产品推荐
相关产品推荐

