How to merge two arrays by summing the merged values [duplicate] How to merge two arrays by summing the merged values [duplicate] arrays arrays

How to merge two arrays by summing the merged values [duplicate]


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

You could shorten this to the following using the error suppression operator, but it should be considered ugly:

$sums = array();foreach (array_keys($a1 + $a2) as $key) {    $sums[$key] = @($a1[$key] + $a2[$key]);}

Alternatively, some mapping:

$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));

Or sort of a combination of both solutions:

$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));

I think these are concise enough to adapt one of them on the spot whenever needed, but to put it in terms of a function that accepts an unlimited number of arrays and sums them:

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;}


My contribution:

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;}

Pass as many arrays to it as you want. Feel free to add some more defense, ability to accept multidimensional arrays, or type checking.

Demo: http://codepad.org/JG6zwAap


its not so complicatedo something like:

$a3 = $a1;foreach($a2 as $k => $v) {    if(array_key_exists($k, $a3)) {       $a3[$k] += $v;    } else {       $a3[$k] = $v;     }}