Otra versión, con algunos beneficios a continuación.
$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);
}
}
Quería combinar lo mejor de la respuesta de Gumbo, Graviton y Chris J con los siguientes objetivos para poder usar esto en mi aplicación:
a) Inicialice las claves de matriz 'suma' fuera del bucle (Gumbo). Debería ayudar con el rendimiento en matrices muy grandes (¡aún no probado!). Elimina avisos.
b) La lógica principal es fácil de entender sin tener que tocar los manuales. (Graviton, Chris J).
c) Resuelva el problema más general de sumar los valores de dos arreglos cualesquiera con las mismas claves y hacerlo menos dependiente de la estructura del subarreglo.
A diferencia de la solución de Gumbo, puede reutilizar esto en los casos en que los valores no estén en submatrices. Imagínese en el ejemplo siguiente que $arr1
y $arr2
no están codificados, pero se devuelven como resultado de llamar a una función dentro de un bucle.
$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);