How do I add it all up by the `index` key in a PHP Array?

Viewed 32

I am using PHP and I have an array

$nnarray = Array ( 
    [9] => Array ( 
        [1] => Array ( 
            [2] => 433 
            [6] => 2 
            [4] => 101 
        ) 
        [3] => Array ( 
            [6] => 999 
        ) 
    ) 
    [14] => Array ( 
        [2] => Array ( 
            [2] => 0 
            [6] => 2 
        ) 
    ) 
)

How do I add it all up by the index key? Output I would like as below

Array ( 
    [9] => 1535
    ) 
    [14] => 2
    ) 
)

1535 = 433+2+101+999 (All value under [9])

Now I using the following script to get the result, is it have another effective way?

foreach($nnarray as $key => $value){
    foreach($nnarray[$key] as $nkey => $nvalue){
        foreach($nnarray[$key][$nkey] as $nnkey => $nnvalue){
            $newarray[$key] = $newarray[$key]+$nnvalue;
        }
        
    }
}
print_r($newarray);
3 Answers

You are confusing keys and values !

$newarray= array(); // create a new array to sum up
foreach ($array as $key1 => $valueArray1) { // looping through main array
    $resultArray[$key1] = 0; // setting initial value to 0.
     foreach ($valueArray1 as $key2 => $valueArray2) { // looping thru inner array
         foreach ($valueArray2 as $key => $value) { // looping thru innermost array
             $newarray[$key1] +=  $value;
         }
     }
}
var_dump($newarray);

And the result will be

array(2) {
  [9]=>
  int(1535)
  [14]=>
  int(2)
}

Shorter version, requires >= PHP7.4.0

map sum => map sum

$result = array_map(fn($v) => array_sum(array_map(fn($v) => array_sum($v), $v)), $data);

Result:

Array
(
    [9] => 1535
    [14] => 2
)

https://3v4l.org/04WcF

A few exotic options.

Iterators:

$result = array_map(function($val)
{
    return array_sum(iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($val))));
}, $array);

Array walking:

$result = array_map(function($val)
{
    array_walk_recursive($val, function($v) use (&$sum) { $sum += $v; });

    return $sum;
}, $array);
Related