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

SAH*_*HAR 3 php arrays if-statement sum array-merge

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

这是我的数组:

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

Array2
(  
   [3] => 199
   [4] => 199
)
Run Code Online (Sandbox Code Playgroud)

我想要的结果是:

Result
(  
   [1] => 199
   [3] => 1505
   [4] => 199
   [5] => 199    
)
Run Code Online (Sandbox Code Playgroud)

我使用了 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);
        }
    }
}   
Run Code Online (Sandbox Code Playgroud)

Don*_*nic 6

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

$merged[$key] = $value + (isset($merged[$key]) ? $merged[$key] : 0);
Run Code Online (Sandbox Code Playgroud)

输出不会与您想要的结果中显示的顺序相同,但您可以使用它ksort($merged);来完成