0

У меня есть многомерный массив так:Как суммировать значения 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, ...) 

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

ответ

1

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

$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. 
0

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

Код: (Demo)

$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 на той же итерации - это ненужная двойная обработка.

Код: (Demo)

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