Outra versão, com alguns benefícios abaixo.
$sum = ArrayHelper::copyKeys($arr[0]);
foreach ($arr as $item) {
ArrayHelper::addArrays($sum, $item);
}
class ArrayHelper {
public function addArrays(Array &$to, Array $from) {
foreach ($from as $key=>$value) {
$to[$key] += $value;
}
}
public function copyKeys(Array $from, $init=0) {
return array_fill_keys(array_keys($from), $init);
}
}
Eu queria combinar o melhor da resposta de Gumbo, Graviton e Chris J com os seguintes objetivos para poder usar isso em meu aplicativo:
a) Inicialize as chaves do array 'sum' fora do loop (Gumbo). Deve ajudar no desempenho em arrays muito grandes (ainda não testado!). Elimina avisos.
b) A lógica principal é fácil de entender sem bater nos manuais. (Graviton, Chris J).
c) Resolva o problema mais geral de adicionar os valores de quaisquer dois arrays com as mesmas chaves e torná-lo menos dependente da estrutura do submatriz.
Ao contrário da solução de Gumbo, você pode reutilizar isso nos casos em que os valores não estão em submatrizes. Imagine no exemplo abaixo que $arr1
e $arr2
não estão embutidos no código, mas estão sendo retornados como resultado da chamada de uma função dentro de um loop.
$arr1 = array(
'gozhi' => 2,
'uzorong' => 1,
'ngangla' => 4,
'langthel' => 5
);
$arr2 = array(
'gozhi' => 5,
'uzorong' => 0,
'ngangla' => 3,
'langthel' => 2
);
$sum = ArrayHelper::copyKeys($arr1);
ArrayHelper::addArrays($sum, $arr1);
ArrayHelper::addArrays($sum, $arr2);