如何按原格式对给定结构的多维数组进行求和?
解决多维数组对应位置求和并保留原格式的问题
要实现这个需求,核心思路是递归遍历数组,对每个层级的对应键值进行累加,同时严格保留原数组的结构。下面是具体的PHP实现代码:
function sumMultiDimensionalArrays($arrays) { // 初始化结果数组,以第一个子数组为结构模板 $result = $arrays[0]; // 遍历后续所有子数组,依次合并求和 for ($i = 1; $i < count($arrays); $i++) { $result = mergeAndSum($result, $arrays[$i]); } return $result; } function mergeAndSum($a, $b) { foreach ($b as $key => $value) { // 若对应位置都是数组,递归处理嵌套层级 if (is_array($value) && isset($a[$key]) && is_array($a[$key])) { $a[$key] = mergeAndSum($a[$key], $value); } // 若都是数值类型,直接累加 elseif (is_numeric($value) && isset($a[$key]) && is_numeric($a[$key])) { $a[$key] += $value; } // 处理键存在性不一致的情况:保留已有的值,或新增不存在的键 else { $a[$key] = isset($a[$key]) ? $a[$key] : $value; } } return $a; }
代码细节说明
sumMultiDimensionalArrays是入口函数:接收你提供的外层数组(包含多个待求和的子数组),以第一个子数组为结构基础,依次和后续子数组执行合并求和操作。mergeAndSum是递归核心函数:- 遍历第二个数组的每个键值对,遇到嵌套数组就递归深入处理;
- 遇到数值则直接累加;
- 针对部分子数组存在额外键或缺失键的情况,自动兼容处理(你可以根据实际需求调整这部分逻辑,比如强制要求所有子数组结构完全一致,或者对缺失键赋值为0)。
使用示例
假设你的原始数组是$data,调用方式如下:
// 你的原始多维数组 $data = array( array( 'manual' => 1, 'cancelled' => 1, 'expired' => 1, 'earned' => 1, 'user' => array( 'user1' => 1, 'user2' => 1, 'user3' => 1, 'user4' => 1, ), 'transfer' => array( 'transfer1' => array( 'key1' => 1, 'key2' => 1, 'key3' => 1, ), 'transfer2' => array( 'key5' => 1, 'key6' => 1, 'key7' => 1, ), ), 'date' => '2018-03-07', ), array( 'manual' => 2, 'cancelled' => 3, 'expired' => 4, 'earned' => 5, 'user' => array( 'user1' => 2, 'user2' => 2, 'user3' => 2, 'user4' => 2, ), 'transfer' => array( 'transfer1' => array( 'key1' => 3, 'key2' => 3, 'key3' => 3, ), 'transfer2' => array( 'key5' => 4, 'key6' => 4, 'key7' => 4, ), ), 'date' => '2018-03-07', ) ); $summedArray = sumMultiDimensionalArrays($data); print_r($summedArray);
运行后会得到结构完全一致的结果,所有对应数值位置都完成累加:比如manual变为3,user1变为3,key1变为4,非数值元素(如date)会保留第一个数组的对应值(或根据else分支逻辑调整)。
额外提示
如果你的数组中存在非数值元素,且需要统一处理(比如所有子数组的date必须相同,否则抛出错误),可以在函数中添加校验逻辑,避免出现不符合预期的结果。
内容的提问来源于stack exchange,提问作者Happy Coder
相关产品推荐
相关产品推荐

