如何合并两个数组并对重复键的值求和?

How to merge two arrays and sum the values of duplicate keys?

我想按条件合并数组。如果数组键匹配则添加值,如果不匹配则保留值。

这是我的数组:

Array1
(   
    [1] => 199
    [3] => 1306
    [5] => 199
)

Array2
(  
   [3] => 199
   [4] => 199
)

我想要的结果是:

Result
(  
   [1] => 199
   [3] => 1505
   [4] => 199
   [5] => 199    
)

我使用了 if-else 条件,但它重复了已经匹配的值。

这是我的编码尝试:

$all=array();   
foreach($sall as $sskey => $ssvalue){
    foreach($upgradesall as $uukey => $uuvalue){
        //$sskey==$uukey?$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue):($sskey!=$uukey? $all[] = array("id"=>$sskey, "amount"=>$ssvalue):($uukey!=$sskey?$all[] = array("id"=>$uukey, "amount"=>$uuvalue):''));
        if($sskey===$uukey){
            $all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue);
        }elseif($sskey!=$uukey){
            $all[] = array("id"=>$sskey, "amount"=>$ssvalue);
        }elseif($uukey!=$sskey){
            $all[] = array("id"=>$uukey, "amount"=>$uuvalue);
        }
    }
}   

您可以通过

实现
$all = array_merge($arr1,$arr2); // existing elements in arr1 are replaced by arr2 else merge into new array_merge
//then add replaced elememnts value
foreach($arr1 as $k=>$v)
{
    if(array_key_exists($k,$all))
    {
        $all[$k] = $all[$k] + $v;
    }
}

首先,您可以通过将所有值合并到同一个键中来合并数组:

$allKeys = array_unique(array_merge(array_keys($arr1),array_keys($arr2)));
$result = [];
foreach ($allKeys as $key) {
    $result[$key] = [];
    if (array_key_exists($key,$arr1)) {
        $result[$key][] = $arr1[$key];
    }
    if (array_key_exists($key,$arr2)) {
        $result[$key][] = $arr2[$key];
    }
}

这将导致:

Array
(
    [1] => Array
        (
            [0] => 199
        )

    [3] => Array
        (
            [0] => 1306
            [1] => 199
        )

    [5] => Array
        (
            [0] => 199
        )

    [4] => Array
        (
            [0] => 199
        )

)

那你就可以根据自己的情况进行映射了:

$endResult = array_map('array_sum',$result);

结果:

Array
(
    [1] => 199
    [3] => 1505
    [5] => 199
    [4] => 199
)

如果您希望对键进行排序,您也可以 运行 通过 ksort 对它们进行排序

查看代码:

http://sandbox.onlinephpfunctions.com/code/3eb23310f0fd8de8174a5caf8b2b91d4b7562b6b

我认为问题比看起来简单。你真的只需要一个条件来排除未定义的偏移量通知。只需迭代两个数组中的所有键和值,并将值添加到合并数组中的相应键。

foreach ([$a1, $a2] as $a) {                             // iterate both arrays
    foreach ($a as $key => $value) {                     // iterate all keys+values
        $merged[$key] = $value + ($merged[$key] ?? 0);   // merge and add
    }
}

实际上,实际执行加法 ($merged[$key] = $value + ($merged[$key] ?? 0);) 的行可以减少到 $merged[$key] += $value;。这仍然有效,但它会产生一堆未定义的偏移量通知。因此,我们可以将键设置为等于值加上先前的值(如果存在)或零。

如果您仍在使用 PHP 5,则可以使用三元代替空合并运算符 (??),如下所示:

$merged[$key] = $value + (isset($merged[$key]) ? $merged[$key] : 0);

输出的顺序与您想要的结果不同,但您可以使用 ksort($merged); 来实现