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

时间:2017-06-30 05:33:43

标签: php arrays if-statement sum array-merge

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

以下是我的数组:

spring.jackson.date-format=com.fasterxml.jackson.databind.util.StdDateFormat

我想要的结果是:

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

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

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

这是我的编码尝试:

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

3 个答案:

答案 0 :(得分:4)

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

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);来完成该输出

答案 1 :(得分:2)

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

$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

答案 2 :(得分:-1)

您可以通过

实现这一目标
$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;
    }
}