[英]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.