Как объединить два массива путем суммирования объединенных значений
Возможный дубликат:
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
и т.д., но я смотрю или умнее, чище. Спасибо за любые указатели!
Ответы
Ответ 1
$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;
}
Ответ 2
Мой вклад:
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
Ответ 3
его не так сложно
сделайте что-нибудь вроде:
$a3 = $a1;
foreach($a2 as $k => $v) {
if(array_key_exists($k, $a3)) {
$a3[$k] += $v;
} else {
$a3[$k] = $v;
}
}
Ответ 4
Вы можете использовать функцию 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
)
Наслаждайтесь!!!!!!!!!!!!!!