简体   繁体   English

用不同数量的子元素添加子数组的值

[英]Add values of subarray with different numbers of sub-elements

I have an array of this structure: 我有这个结构的数组:

 Array ( [0] => Array ( [0] => Array ( [year] => 2014 [weeknumber] => 1 [foo1] => 1 [foo2] => 2 [foo3] => 3 ) [1] => Array ( [year] => 2014 [weeknumber] => 2 [foo1] => 1 [foo2] => 2 [foo3] => 3 ) [2] => Array ( [year] => 2014 [weeknumber] => 3 [foo1] => 1 [foo2] => 2 [foo3] => 3 ) ) [1] => Array ( [0] => Array ( [year] => 2014 [weeknumber] => 1 [foo1] => 1 [foo2] => 2 [foo3] => 3 ) [1] => Array ( [year] => 2014 [weeknumber] => 2 [foo1] => 1 [foo2] => 2 [foo3] => 3 ) [2] => Array ( [year] => 2014 [weeknumber] => 3 [foo1] => 1 [foo2] => 2 [foo3] => 3 ) ) ) 

I count the sub-elements with this function: 我用这个函数计算子元素:

 $final = array(); foreach($array as $index1 => $sub_array1) { $i = 0; foreach($sub_array1 as $index2 => $final_sub_array) { $wn = $final_sub_array['weeknumber']; $year = $final_sub_array['year']; unset($final_sub_array['year']); unset($final_sub_array['weeknumber']); foreach($final_sub_array as $key => $value) { if(isset($final[$i][$key])) { $final[$i][$key] += $value; } else { $final[$i][$key] = $value; } $final[$i]['kw'] = $wn; $final[$i]['jahr'] = $year; } $i++; } } 

The script only works if $ final_sub_array always has the same number of elements. 该脚本仅在$ final_sub_array始终具有相同数量的元素时才有效。 But if one arrray has only 1 or 2 elements and the others have more, it no longer works. 但是,如果一个方格只有1或2个元素,而其他方则更多,则它不再起作用。 How can I fix that? 我该如何解决? All entries with the same year and the same week number must be added together. 具有相同年份和相同星期编号的所有条目必须加在一起。


Here is the code to play with: 这是要使用的代码:

<?php
$var =
array (
113 => 
array (
  0 => 
  array (
    'id' => '1537',
    'kw' => '22',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '113',
  ),
  1 => 
  array (
    'id' => '1541',
    'kw' => '23',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '113',
  ),
  2 => 
  array (
    'id' => '1543',
    'kw' => '24',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '113',
  ),
),
114 => 
array (
  0 => 
  array (
    'id' => '1538',
    'kw' => '22',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '114',
  ),
  1 => 
  array (
    'id' => '1540',
    'kw' => '23',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '114',
  ),
  2 => 
  array (
    'id' => '1544',
    'kw' => '24',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '114',
  ),
),
115 => 
array (
  0 => 
  array (
    'id' => '1539',
    'kw' => '22',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '115',
  ),
  1 => 
  array (
    'id' => '1542',
    'kw' => '23',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '115',
  ),
  2 => 
  array (
    'id' => '1545',
    'kw' => '24',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '115',
  ),
),
116 => 
array (
  0 => 
  array (
    'id' => '1546',
    'kw' => '24',
    'jahr' => '2014',
    'anzahl_betten' => '10',
    'zugange_dauerpflege' => '0',
    'zugange_kurzzeitpflege' => '0',
    'abgange_dauerpflege_sterbefalle' => '0',
    'abgange_dauerpflege_auszuge' => '0',
    'abgange_kurzzeitpflege' => '0',
    'wechsel_kurz_dauer' => '0',
    'anzahl_tage' => '0',
    'geplante_einzuge' => '0',
    'hID' => '116',
  ),
),
);
foreach($var as $index1 => $sub_array1)
{
$i = 0;
  foreach($sub_array1 as $index2 => $final_sub_array)
  {
      $kw = $final_sub_array['kw'];
      $jahr = $final_sub_array['jahr'];
      unset($final_sub_array['id']);
      unset($final_sub_array['kw']);
      unset($final_sub_array['jahr']);
      unset($final_sub_array['hID']);
      foreach($final_sub_array as $key => $value)
      {
          if(isset($final[$i][$key])) {
              $final[$i][$key] += $value;
          }
          else {
              $final[$i][$key] = $value;
          }
          $final[$i]['kw'] = $kw;
          $final[$i]['jahr'] = $jahr;
      }
    $i++;
  }
}
echo '<pre>';
print_r($final);
echo '</pre>';
?>

if you delete the last array with the key 116 everything is working. 如果使用键116删除最后一个数组,则一切正常。 But with it, it doubles the kw 24 and counts wrong. 但是有了它,它使kw 24倍增,并且计数错误。

I think this may be what you want. 我想这可能就是您想要的。 It uses $kw as the key of the final array, not $i , so that it combines sub-arrays with the same kw value. 它使用$kw作为最终数组的键,而不是$i ,因此它将具有相同kw值的子数组组合在一起。 I'm a little confused about what you're doing with jahr , though. 不过,我对您对jahr所做的工作感到有些困惑。 If there are entries with the same kw but different jahr , the final result will have the last jahr . 如果存在具有相同kw但不同jahr ,则最终结果将具有最后一个jahr

foreach($var as $index1 => $sub_array1)
{
  foreach($sub_array1 as $index2 => $final_sub_array)
  {
      $kw = $final_sub_array['kw'];
      $jahr = $final_sub_array['jahr'];
      unset($final_sub_array['id']);
      unset($final_sub_array['kw']);
      unset($final_sub_array['jahr']);
      unset($final_sub_array['hID']);
      foreach($final_sub_array as $key => $value)
      {
          if(isset($final[$kw][$key])) {
              $final[$kw][$key] += $value;
          }
          else {
              $final[$kw][$key] = $value;
          }
          $final[$kw]['kw'] = $kw;
          $final[$kw]['jahr'] = $jahr;
      }
    $i++;
  }
}

BTW, if this is coming from a database query, it seems like you would be able to get the database to do all the summing for you, with SUM(col1+col2+col3...) ... GROUP BY kw . 顺便说一句,如果这是来自数据库查询,看来您可以使用SUM(col1+col2+col3...) ... GROUP BY kw使数据库能够为您进行所有求和。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM