Как объединить два массива путем суммирования объединенных значений

Возможный дубликат:
PHP: как суммировать значения массива одного и того же ключа

Я ищу функцию array_merge() , которая НЕ заменяет значения, а ADDS их.

Например, это код, который я пытаюсь сделать:

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

К сожалению, это приводит к следующему:

 Array ( [a] => 3 [b] => 9 [c] => 7 [d] => 10 ) 

Затем я попытался вместо array_merge просто добавить два массива

 $a3 = $a1 + $a2; 

Но эти результаты

 Array ( [a] => 2 [b] => 0 [c] => 5 [d] => 10 ) 

Я действительно хочу, чтобы иметь возможность передавать столько массивов, сколько необходимо, а затем получить их сумму. Поэтому в моем примере я хочу, чтобы результат был следующим:

 Array ( [a] => 5 [b] => 9 [c] => 12 [d] => 10 ) 

Конечно, я могу schlepp и построить некоторые функции со многими foreach т. Д., Но я смотрю или умнее, чище. Спасибо за любые указатели!

Solutions Collecting From Web of "Как объединить два массива путем суммирования объединенных значений"

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

Вы можете сократить это до следующего с помощью оператора подавления ошибок, но его следует считать уродливым:

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

Альтернативно, некоторое отображение:

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

Или комбинация обоих решений:

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

Я думаю, что они достаточно лаконичны, чтобы адаптировать один из них на месте, когда это необходимо, но поставить его в терминах функции, которая принимает неограниченное количество массивов и суммирует их:

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

Мой вклад:

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

Передайте столько массивов, сколько захотите. Не стесняйтесь добавлять дополнительную защиту, возможность принимать многомерные массивы или проверять тип.

Демо: http://codepad.org/JG6zwAap

его не очень сложно сделать что-то вроде:

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

Вы можете использовать функцию array_push. Я надеюсь, что это поможет вам

 foreach($a2 as $a2){ array_push($a1, $a2); } print_r($a1); Output: Array ( [a] => 2 [b] => 0 [c] => 5 [0] => 3 [1] => 9 [2] => 7 [3] => 10 ) 

ИЛИ вы можете изменить свою логику в ключевом значении с помощью чисел. Он работает даже с таким же числом:

 <?php $beginning = array(1 => 'foo'); $end = array(1 => 'bar'); $result = array_merge((array)$beginning, (array)$end); print_r($result); ?> Output: Array ( [0] => foo [1] => bar ) 

Наслаждаться!!!!!!!!!!!!!!