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

如何按原格式对给定结构的多维数组进行求和?

解决多维数组对应位置求和并保留原格式的问题

要实现这个需求,核心思路是递归遍历数组,对每个层级的对应键值进行累加,同时严格保留原数组的结构。下面是具体的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:18:12