如何通过对合并值求和来合并两个数组

Eri*_*ick 29 php arrays sum

可能重复:
PHP:如何对相同键的数组的值求和

我正在寻找一个array_merge()不替换值的函数,但是要添加它们.

例如,这是我正在尝试的代码:

    echo "<pre>"; 

    $a1 = array(
         "a" => 2
        ,"b" => 0
        ,"c" => 5
    );

    $a2 = array(
         "a" => 3
        ,"b" => 9
        ,"c" => 7
        ,"d" => 10
    );

    $a3 = array_merge($a1, $a2);
    print_r($a3); 
Run Code Online (Sandbox Code Playgroud)

可悲的是,这输出了这个:

Array
(
    [a] => 3
    [b] => 9
    [c] => 7
    [d] => 10
)
Run Code Online (Sandbox Code Playgroud)

然后我尝试了,而不是array_merge简单地添加两个数组

$a3 = $a1 + $a2;
Run Code Online (Sandbox Code Playgroud)

但这是输出

Array
(
    [a] => 2
    [b] => 0
    [c] => 5
    [d] => 10
)
Run Code Online (Sandbox Code Playgroud)

我真正想要的是能够根据需要传递尽可能多的数组,然后得到它们的总和.所以在我的例子中,我希望输出为:

Array
(
    [a] => 5
    [b] => 9
    [c] => 12
    [d] => 10
)
Run Code Online (Sandbox Code Playgroud)

当然,我可以schlepp并与许多foreach等建立一些功能,但我正在寻找或更聪明,更清洁的解决方案.感谢您的任何指示!

dec*_*eze 58

$sums = array();
foreach (array_keys($a1 + $a2) as $key) {
    $sums[$key] = (isset($a1[$key]) ? $a1[$key] : 0) + (isset($a2[$key]) ? $a2[$key] : 0);
}
Run Code Online (Sandbox Code Playgroud)

可以使用错误抑制运算符将此缩短为以下内容,但应将其视为丑陋:

$sums = array();
foreach (array_keys($a1 + $a2) as $key) {
    $sums[$key] = @($a1[$key] + $a2[$key]);
}
Run Code Online (Sandbox Code Playgroud)

或者,一些映射:

$keys = array_fill_keys(array_keys($a1 + $a2), 0);
$sums = array_map(function ($a1, $a2) { return $a1 + $a2; }, array_merge($keys, $a1), array_merge($keys, $a2));
Run Code Online (Sandbox Code Playgroud)

或者两种解决方案的组合:

$sums = array_fill_keys(array_keys($a1 + $a2), 0);
array_walk($sums, function (&$value, $key, $arrs) { $value = @($arrs[0][$key] + $arrs[1][$key]); }, array($a1, $a2));
Run Code Online (Sandbox Code Playgroud)

我认为这些都足够简洁,可以根据需要在现场调整其中一个,但是根据一个接受无限数量的数组并对它们求和的函数来说:

function array_sum_identical_keys() {
    $arrays = func_get_args();
    $keys = array_keys(array_reduce($arrays, function ($keys, $arr) { return $keys + $arr; }, array()));
    $sums = array();

    foreach ($keys as $key) {
        $sums[$key] = array_reduce($arrays, function ($sum, $arr) use ($key) { return $sum + @$arr[$key]; });
    }
    return $sums;
}
Run Code Online (Sandbox Code Playgroud)

  • 现在,为什么要对此一票否决?它可能看起来很神秘,但前提是您不习惯于对集合和函数进行思考。IMO比嵌套循环或大量if优雅得多。 (2认同)
  • 第三个解决方案为我重置了数组键。 (2认同)

Wes*_*rch 13

我的贡献:

function array_merge_numeric_values()
{
    $arrays = func_get_args();
    $merged = array();
    foreach ($arrays as $array)
    {
        foreach ($array as $key => $value)
        {
            if ( ! is_numeric($value))
            {
                continue;
            }
            if ( ! isset($merged[$key]))
            {
                $merged[$key] = $value;
            }
            else
            {
                $merged[$key] += $value;
            }
        }
    }
    return $merged;
}
Run Code Online (Sandbox Code Playgroud)

根据需要将尽可能多的数组传递给它.随意添加一些防御,接受多维数组或类型检查的能力.

演示:http://codepad.org/JG6zwAap


Hai*_*vgi 5

它并不那么复杂,请执行以下操作:

$a3 = $a1;

foreach($a2 as $k => $v) {
    if(array_key_exists($k, $a3)) {
       $a3[$k] += $v;
    } else {
       $a3[$k] = $v; 
    }
}
Run Code Online (Sandbox Code Playgroud)