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

多数组合并:相同键下price与qty求和,其余值取最后项

PHP数组动态合并需求及正确实现

需求说明

需要实现动态合并任意数量的PHP数组,合并规则如下:

  • 对于拥有相同顶级键的元素:
    • price和qty字段的值转为数值后求和
    • name、category等其他字段保留最后出现数组中的对应值

示例数组

<?php
$arr1 = [
    51 => [
        'name' => 'p1',
        'price' => '20',
        'qty' => '10',
        'category' => 'c1'
    ],
    
    3 => [
        'name' => 'p2',
        'price' => '10.50',
        'qty' => '3',
        'category' => 'c2'
    ]
];
    
$arr2 = [
    3 => [
        'name' => 'p3',
        'price' => '23',
        'qty' => '22',
        'category' => 'c1'
    ],
    
    102 => [
        'name' => 'p4',
        'price' => '10.50',
        'qty' => '8',
        'category' => 'c2'
    ]
];

当前错误代码

mergeArrays(($arr1 + $arr2));

function mergeArrays($array)
{
    $mergedArray = [];
    foreach ($array as $k => $arr) {
        foreach ($arr as $key => $value) {
            if (!isset($mergedArray[$key])) {
                $mergedArray[$k][$key] = $value;
            } else {
                $mergedArray[$key] += $value;
            }
        }
    }
    print_r($mergedArray);
    //return $mergedArray;
}

当前代码输出

Array
(
    [51] => Array
        (
            [name] => p1
            [price] => 20
            [qty] => 10
            [category] => c1
        )

    [3] => Array
        (
            [name] => p2
            [price] => 10.50
            [qty] => 3
            [category] => c2
        )

    [102] => Array
        (
            [name] => p4
            [price] => 10.50
            [qty] => 8
            [category] => c2
        )

)

期望输出结果

Array
(
    [51] => Array
        (
            [name] => p1
            [price] => 20
            [qty] => 10
            [category] => c1
        )

    [3] => Array
        (
            [name] => p3       // 取最后出现数组的值
            [price] => 33.50   // 求和结果
            [qty] => 25        // 求和结果
            [category] => c1   // 取最后出现数组的值
        )

    [102] => Array
        (
            [name] => p4
            [price] => 10.50
            [qty] => 8
            [category] => c2
        )

)

解决方案

修改函数逻辑,支持接收任意数量的数组参数,按规则处理每个字段:

<?php
function mergeArrays(...$arrays) {
    $merged = [];
    
    foreach ($arrays as $array) {
        foreach ($array as $key => $item) {
            // 顶级键已存在,处理求和与覆盖逻辑
            if (isset($merged[$key])) {
                // price和qty转数值后求和
                $merged[$key]['price'] = (float)$merged[$key]['price'] + (float)$item['price'];
                $merged[$key]['qty'] = (int)$merged[$key]['qty'] + (int)$item['qty'];
                // 其他字段覆盖为当前数组的值(保留最后出现的)
                foreach ($item as $field => $value) {
                    if (!in_array($field, ['price', 'qty'])) {
                        $merged[$key][$field] = $value;
                    }
                }
            } else {
                // 顶级键不存在,直接赋值
                $merged[$key] = $item;
            }
        }
    }
    
    return $merged;
}

// 调用示例
$result = mergeArrays($arr1, $arr2);
print_r($result);

代码说明

  1. 使用...$arrays语法接收任意数量的输入数组,实现动态合并
  2. 遍历每个输入数组的顶级键:
    • 若键已存在:将price转浮点、qty转整数后求和,其他字段直接覆盖为当前数组的对应值
    • 若键不存在:直接将当前元素加入结果数组
  3. 返回符合规则的合并后数组

内容的提问来源于stack exchange,提问作者PЯINCƎ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:40:33