Valores de matriz de sum da mesma chave

Como posso adicionar todos os valores da chave [gozhi] ? Observe que a chave [gozhi] é dinâmica .

Matriz de input:

 Array ( [0] => Array ( [gozhi] => 2 [uzorong] => 1 [ngangla] => 4 [langthel] => 5 ) [1] => Array ( [gozhi] => 5 [uzorong] => 0 [ngangla] => 3 [langthel] => 2 ) [2] => Array ( [gozhi] => 3 [uzorong] => 0 [ngangla] => 1 [langthel] => 3 ) ) 

Resultado desejado :

 Array ( [gozhi] => 10 [uzorong] => 1 [ngangla] => 8 [langthel] => 10 ) 

 $sumArray = array(); foreach ($myArray as $k=>$subArray) { foreach ($subArray as $id=>$value) { $sumArray[$id]+=$value; } } print_r($sumArray); 

Você pode usar array_walk_recursive() para obter uma solução de caso geral para o seu problema ( aquele em que cada matriz interna possivelmente pode ter chaves únicas ).

 $final = array(); array_walk_recursive($input, function($item, $key) use (&$final){ $final[$key] = isset($final[$key]) ? $item + $final[$key] : $item; }); 

Exemplo com array_walk_recursive() para o caso geral

Além disso, desde o PHP 5.5 você pode usar a function array_column() para alcançar o resultado desejado para a chave exata , [gozhi] , por exemplo:

 array_sum(array_column($input, 'gozhi')); 

Exemplo com array_column() para a chave especificada

Se você deseja obter a sum total de todos os arrays internos com as mesmas teclas ( o resultado desejado que você postou ), você pode fazer algo como isto ( tendo em mente que a primeira matriz interna deve ter a mesma estrutura que as demais ):

 $final = array_shift($input); foreach ($final as $key => &$value){ $value += array_sum(array_column($input, $key)); } unset($value); 

Exemplo com array_column() no caso de todos os arrays internos terem as mesmas teclas

Se você quer uma solução de caso geral usando array_column() então, no início, você pode considerar obter todas as chaves únicas e, em seguida, obter a sum para cada chave:

 $final = array(); foreach($input as $value) $final = array_merge($final, $value); foreach($final as $key => &$value) $value = array_sum(array_column($input, $key)); unset($value); 

Exemplo com array_column() para o caso geral

Aqui está uma solução semelhante às outras duas:

 $acc = array_shift($arr); foreach ($arr as $val) { foreach ($val as $key => $val) { $acc[$key] += $val; } } 

Mas isso não precisa verificar se as chaves da matriz já existem e não lança notifications nem.

Também pode ser feito usando array_map :

 $rArray = array( 0 => array( 'gozhi' => 2, 'uzorong' => 1, 'ngangla' => 4, 'langthel' => 5 ), 1 => array( 'gozhi' => 5, 'uzorong' => 0, 'ngangla' => 3, 'langthel' => 2 ), 2 => array( 'gozhi' => 3, 'uzorong' => 0, 'ngangla' => 1, 'langthel' => 3 ), ); $sumResult = call_user_func_array('array_map', array_merge(['sum'], $rArray)); function sum() { return array_sum(func_get_args()); } 
 $newarr=array(); foreach($arrs as $value) { foreach($value as $key=>$secondValue) { if(!isset($newarr[$key])) { $newarr[$key]=0; } $newarr[$key]+=$secondValue; } } 

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 objectives para que eu pudesse usar isso no meu aplicativo:

a) Inicialize as teclas de matriz ‘sum’ fora do loop (Gumbo). Deve ajudar com o 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 duas matrizes com as mesmas chaves e torná-la menos dependente da estrutura da sub-matriz.

Ao contrário da solução de Gumbo, você pode reutilizar isso nos casos em que os valores não estão em sub-arrays. Imagine no exemplo abaixo que $arr1 e $arr2 não são codificados, mas estão sendo retornados como resultado de chamar uma function 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); 

Também pode ser feito usando array_walk :

 function array_sum_values(array $input, $key) { $sum = 0; array_walk($input, function($item, $index, $params) { if (!empty($item[$params[1]])) $params[0] += $item[$params[1]]; }, array(&$sum, $key) ); return $sum; } var_dump(array_sum_values($arr, 'gozhi')); 

Não tão legível como soluções anteriores, mas funciona 🙂

Aqui está uma versão em que as chaves da matriz podem não ser as mesmas para ambos os arrays, mas você quer que todos estejam lá na matriz final.

 function array_add_by_key( $array1, $array2 ) { foreach ( $array2 as $k => $a ) { if ( array_key_exists( $k, $array1 ) ) { $array1[$k] += $a; } else { $array1[$k] = $a; } } return $array1; } 

Você pode tentar isso:

 $c = array_map(function () { return array_sum(func_get_args()); },$a, $b); 

e finalmente:

 print_r($c); 

Precisamos verificar primeiro se a chave da matriz existe.

CÓDIGO:

 $sum = array(); foreach ($array as $key => $sub_array) { foreach ($sub_array as $sub_key => $value) { //If array key doesn't exists then create and initize first before we add a value. //Without this we will have an Undefined index error. if( ! array_key_exists($sub_key, $sum)) $sum[$sub_key] = 0; //Add Value $sum[$sub_key]+=$value; } } print_r($sum); 

SAÍDA com validação de chave de matriz:

 Array ( [gozhi] => 10 [uzorong] => 1 [ngangla] => 8 [langthel] => 10 ) 

SAÍDA sem validação da chave de matriz:

 Notice: Undefined index: gozhi in F:\web\index.php on line 37 Notice: Undefined index: uzorong in F:\web\index.php on line 37 Notice: Undefined index: ngangla in F:\web\index.php on line 37 Notice: Undefined index: langthel in F:\web\index.php on line 37 Array ( [gozhi] => 10 [uzorong] => 1 [ngangla] => 8 [langthel] => 10 ) 

Esta é uma prática ruim, embora ele imprima a saída. Verifique sempre primeiro se a chave existe.

Para aqueles que aterraram aqui e estão procurando por uma solução que combina N arrays E também resume os valores de chaves idênticas encontradas nos N arrays, escrevi esta function que funciona de forma recursiva também. (Consulte: https://gist.github.com/Nickology/f700e319cbafab5eaedc )

Exemplo:

 $a = array( "A" => "bob", "sum" => 10, "C" => array("x","y","z" => 50) ); $b = array( "A" => "max", "sum" => 12, "C" => array("x","y","z" => 45) ); $c = array( "A" => "tom", "sum" => 8, "C" => array("x","y","z" => 50, "w" => 1) ); print_r(array_merge_recursive_numeric($a,$b,$c)); 

Vai resultar em:

 Array ( [A] => tom [sum] => 30 [C] => Array ( [0] => x [1] => y [z] => 145 [w] => 1 ) ) 

Aqui está o código:

  * @access public * @return void */ function array_merge_recursive_numeric() { // Gather all arrays $arrays = func_get_args(); // If there's only one array, it's already merged if (count($arrays)==1) { return $arrays[0]; } // Remove any items in $arrays that are NOT arrays foreach($arrays as $key => $array) { if (!is_array($array)) { unset($arrays[$key]); } } // We start by setting the first array as our final array. // We will merge all other arrays with this one. $final = array_shift($arrays); foreach($arrays as $b) { foreach($final as $key => $value) { // If $key does not exist in $b, then it is unique and can be safely merged if (!isset($b[$key])) { $final[$key] = $value; } else { // If $key is present in $b, then we need to merge and sum numeric values in both if ( is_numeric($value) && is_numeric($b[$key]) ) { // If both values for these keys are numeric, we sum them $final[$key] = $value + $b[$key]; } else if (is_array($value) && is_array($b[$key])) { // If both values are arrays, we recursively call ourself $final[$key] = array_merge_recursive_numeric($value, $b[$key]); } else { // If both keys exist but differ in type, then we cannot merge them. // In this scenario, we will $b's value for $key is used $final[$key] = $b[$key]; } } } // Finally, we need to merge any keys that exist only in $b foreach($b as $key => $value) { if (!isset($final[$key])) { $final[$key] = $value; } } } return $final; } ?> 

Aqui você tem como eu costumo fazer esse tipo de operações.

 // We declare an empty array in wich we will store the results $sumArray = array(); // We loop through all the key-value pairs in $myArray foreach ($myArray as $k=>$subArray) { // Each value is an array, we loop through it foreach ($subArray as $id=>$value) { // If $sumArray has not $id as key we initialize it to zero if(!isset($sumArray[$id])){ $sumArray[$id] = 0; } // If the array already has a key named $id, we increment its value $sumArray[$id]+=$value; } } print_r($sumArray); 
 $sumArray = array(); foreach ($myArray as $k => $subArray) { foreach ($subArray as $id => $value) { if (!isset($sumArray[$id])) { $sumArray[$id] = 0; } $sumArray[$id]+=$value; } } 
 $sumArray = array(); foreach ($myArray as $k=>$subArray) { foreach ($subArray as $id=>$value) { if(!isset($sumArray[$id])){ $sumArray[$id] =$value; }else { $sumArray[$id]+=$value; } } } print_r($sumArray); ` 

Isso funciona muito bem no meu projeto laravel

 print_r($Array); // your original array $_SUM = []; // count($Array[0]) => if the number of keys are equall in all arrays then do a count of index 0 etc. for ($i=0; $i < count($Array[0]); $i++) { $_SUM[] = $Array[0][$i] + $Array[1][$i]; // do a for loop on the count } print_r($_SUM); // get a sumed up array