Как суммировать значения 2-го уровня 2-мерного массива на основе ключей 2-го уровня?

У меня есть многомерный массив, как это:

array(
0 => array(
11 => 18.000,
14 => 25.100,
15 => 5.000,
16 => 8.000,
19 => 21.600'
),
1 => array(
11 => 9.100,
12 => 2.700,
14 => 2.300,
15 => 18.800,
16 => 9.500,
17 => 6.900,
19 => 9.400'
),
2 => array(
14 => 5.700
),
3 => array(
17 => 2.800,
20 => 6.000
),
4 => array(
24 => 5.000,
25 => 6.000,
26 => 2.7
),
5 => array(
16 => 2.200
),
6 => array(
14 => 13.000,
15 => 2.000,
16 => 4.300,
19 => 6.000
),
7 => array(
32 => 5.000,
36 => 18.500
)
)

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

Например, если массив называется $multi_dime, Я хотел бы получить $multi_dime[0][11] добавить его в $multi_dime[1][11] и так далее.

Если ключ не существует в следующем массиве. Следует просто добавить 0 или игнорируй это. Код должен выполнить это для всех ключей в массиве второго уровня и сохранить результаты в другом массиве, например:

array(  11 => 27.1,  14 => 46.1, ...)

Как мне этого добиться? Массив всегда будет двухмерным, но может иметь любую длину, а массивы второго уровня также могут быть любой длины.

0

Решение

Просто используйте foreach или for loop. Именно так вы работаете с массивами, будь то один, два, три, четыре или двести мерные. Поскольку у вас будет более одной суммы, сделайте переменную суммы массивом. Объявите это вне вашего цикла, потому что он вам понадобится после завершения цикла.

$sums = array();
foreach($multi_dime as $vals)
{
foreach($vals as $key=>$val)
{
// Now we are looping through all values in the second dimension.
// If the key is not in the sums array, make it.
if(!isset($sums[$key])) $sums[$key]=0;
// We add this sum to the key now.
$sums[$key]+= $val;
}
}
ksort($sums); // Just in case you want the keys in order.
print_r($sums); // See all the sums.
1

Другие решения

Вот менее эффективный (я предполагаю) метод для расчета суммы всех столбцов, специфичных для ключа. Единственное отличие состоит в том, что в моем методе нет повторяющихся условных выражений, хотя он вызывает более «тяжелые» функции.

Код: (демонстрация)

$result=[];
foreach($array as $subarray){
$subarray=array_diff_key($subarray,$result);  // deny iteration of previously summed subarray keys
foreach($subarray as $k=>$v){
$result[$k]=array_sum(array_column($array,$k));  // sum the whole array's column
}
}
var_export($result);

Если бы это был мой проект, я бы писал свой код очень похоже на код Kainaw (но не совсем). Я не предпочитаю декларировать начальное значение как 0 затем добавляя к 0 в той же итерации — ненужная двойная обработка.

Код: (демонстрация)

foreach($array as $subarray){
foreach($subarray as $k=>$v){
if(!isset($result[$k])){
$result[$k]=$v;
}else{
$result[$k]+=$v;
}
}
}
var_export($result);
0

По вопросам рекламы [email protected]