Сумма элементов подмассива

275
05 апреля 2017, 17:18

В переменной лежит такой массив

Array ( 
  [1] => Array ( 
      [1] => 4 
      [5] => 7 
  ) 
  [2] => Array ( 
      [1] => 2 
      [5] => 5 
  ) 
  [3] => Array ( 
      [1] => 2 
      [5] => 5 
  ) 
  [4] => Array (
      [1] => 6 
      [5] => 9 
  )
  [5] => Array (
      [1] => 6 
      [5] => 8 
  )
)

Вопрос, как можно посчитать сумма элементов с индексом [1] и с индексом [5], во вложенном массиве, без хардкода?

Answer 1

Пришел только 1 вариант, возможно есть вариант проще:

function array_counter($in) {
    $out = [];
    foreach ($in as $array){
        foreach ($array as $index => $value){
            if (array_key_exists($index, $out)){
                $out[$index] += $value;
            } else {
                $out[$index] = $value;
            }
        }
    }
    return $out;
}

Пример работы функции:

$array = [
    [
        1 => 4,
        5 => 7
    ],
    [
        1 => 2,
        5 => 5
    ],
    [
        1 => 6,
        5 => 9
    ],
];
var_dump(array_counter($array));

Вывод будет:

array(2) {
  [1] =>
  int(12)
  [5] =>
  int(21)
}
Answer 2

Не знаю, какой тут может быть хардкор, но самый простой способ, вероятно, будет следующим.

$sum = [1 => 0, 5 => 0];
array_walk_recursive($data, function($v, $k) use (&$sum){ $sum[$k] += $v; });

callback-метод функции array_walk_recursive в качестве параметра получает значение элемента и его ключ. Если значение само явялется массивом, то на обработку оно не попадает, поэтому на конечную функцию всегда попадают только пары с ключом 1 или 5 с их значениями.

upd:
в случае, если набор ключей массив может меняться, необходимо проверять их наличие:

$sum = [];
array_walk_recursive($data, function($v, $k) use (&$sum){.
    if(!array_key_exists($k, $sum)){
        $sum[$k] = $v;
    }
    else{
       $sum[$k] += $v;.
    }
});
Answer 3

Есть специальный для этого метод array_sum

$a = [
    [1 => 4, 5 => 5 ] ,
    [1 => 3, 5 => 6 ] ,
    [1 => 2, 5 => 7 ] ,
    [1 => 1, 5 => 8 ] ,
    [1 => 0, 5 => 9 ] ,  
];
//сумма всех значений колонки 1
$b = array_sum(array_column($a , 1));
//сумма всех значений колонки 5
$c = array_sum(array_column($a , 5));
//сумма всех значений 
$d = array_sum(array_map('array_sum' , $a));
print_r([
    $b, $c ,$d  
]);

На выход :

(
    [0] => 10
    [1] => 35
    [2] => 45
)
READ ALSO
простая реализация системы blockchain [требует правки]

простая реализация системы blockchain [требует правки]

Встречались ли вам статьи где с реальными примерами был реализован blockchain ?

417
Парсинг сайта с использованием xPath в php

Парсинг сайта с использованием xPath в php

Здравствуйте! Я работаю с xPath для парсинга интернет-сайтовЕсть код: Код (Text):

282
PHP. Помощь с алгоритмом

PHP. Помощь с алгоритмом

На сайте реализована функция определения города и региона по ipТак вот, нужно чтобы у каждого города или региона выводилась определенная...

232
SetCookie массив php

SetCookie массив php

Как в PHP в setCookie() передать массив?

265