添加具有不同数量的子元素的子阵列的值

时间:2014-05-27 10:29:00

标签: php arrays

我有一个这种结构的数组:

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
                )
        )
)

我用这个函数计算子元素:

$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++;
    }
}

只有$ final_sub_array始终具有相同数量的元素时,该脚本才有效。 但是如果一个arrray只有1个或2个元素而其他元素有更多元素,则它不再有效。我该如何解决这个问题? 所有具有相同年份和相同周数的条目必须加在一起。


以下是要使用的代码:

<?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>';
?>

如果用键116删除最后一个数组,一切正常。但有了它,它会使kw 24增加一倍并且计算错误。

1 个答案:

答案 0 :(得分:0)

我认为这可能是你想要的。它使用$kw作为最终数组的键,而不是$i,因此它将子数组与相同的kw值组合在一起。不过,我对你在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++;
  }
}

顺便说一句,如果这是来自数据库查询,那么您似乎可以使用SUM(col1+col2+col3...) ... GROUP BY kw让数据库为您完成所有求和。