我的数据如下:
Array
(
[1] => Array
(
[A] => Array
(
[AA] => 3
[AB] => 5
)
[B] => Array
(
[BA] => 2
)
[2] => Array
(
[C] => Array
(
[CA] => 4
)
[D] => Array
(
[DA] => 1
[DB] => 2
)
)
[3] => Array
(
[E] => Array
(
[EA] => 1
[EB] => 2
[EC] => 3
)
[F] => Array
(
[FA] => 0
[FB] => 7
[FC] => 7
)
)
我想总结价值,这是我的期望:
Array(
[1] => 10
[2] => 7
[3] => 20
)
这是我用来汇总值的代码:
$total[$country_id][$province_id][$city_id] = $amount;
$result = array();
foreach( $total as $key => $val ){
$total[$key] = array_sum ( $val );
}
有人可以解释我的代码有什么问题或解释foreach是如何工作的吗?因为我的代码的结果是0,实际上我只研究了约1周的foreach。感谢
答案 0 :(得分:3)
如果您想了解有关foreach
的更多信息,请使用以下是一个更详细的解决方案:
$total = 0;
$totalByCountry = [];
// iterate over each country
foreach ($arr as $countryId => $provinces) {
$totalByCountry[$countryId] = 0;
// iterate over each province
foreach ($provinces as $provinceId => $cities) {
// iterate over each city
foreach ($cities as $cityId => $value) {
$totalByCountry[$countryId] += $value;
$total += $value;
}
}
}
var_dump(totalByCountry)
的结果:
array (size=3)
1 => int 10
2 => int 7
3 => int 20
var_dump($total)
的结果:
int 37
- 编辑 -
在现实世界的项目中,你最好不要那么冗长,并且使用为array_walk_recursive()这类情况制作的php函数,就像在Philipp Maurer和Firoz Ahmad答案一样。
答案 1 :(得分:1)
foreach
的问题在于,您的数组是三层深,而foreach
仅遍历第一层而array_sum()
仅计算第二层。
你的foreach的一个例子:
$total = [
0 => [
'A' => [
'AA' => 1,
'AB' => 2
],
'B' => [
'BA' => 3,
'BB' => 4
]
]
];
foreach( $total as $key => $val ){
$total[$key] = array_sum ( $val );
}
foreach
将遍历$total
数组。这是示例的iteraton:
$key = 0
; $value = ['A'=>['AA'=>1,'AB'=>2], 'B'=>['BA'=>3,'BB'=>4]]
array_sum()
上致电$value
。 array_sum()
将所提供数组的子项添加到一起,如果它们是数字的话。遗憾的是$value
是一个二维数组,它的子节点是数组,所以它们不是数字。这就是为什么返回0
的原因。 问题的解决方案是使用array_walk_recursive()
函数遍历内部数组并在其上调用函数,您可以指定:
$sum = 0;
array_walk_recursive($total, function($value) use (&$sum) {
$sum += $value;
});
指定的函数将数组中每个叶子的值添加到指定的变量$sum
,该变量通过引用函数给出。
答案 2 :(得分:0)
打印$ total,当来到foreach时,$ val是一个数组。因此,在调用array_sum函数时,它会对第一个数组求和,并将总数分配给新数组的第一个元素。这就是这个工作方式。您编码的原因不起作用,应该在foreach之外提供您已提供的foreach。从foreach的范围之上删除这个foreach。
<?php
$x=[0=>[1,2,3],1=>[2,3,4]];
$result = array();
foreach( $x as $key => $val ){
$total[$key] = array_sum ( $val );
}
var_dump($total);
?>
如果您的数组是3维代码就是这样,
$y=[0=>[0=>[1,2,3],1=>[3,4,5]],1=>[0=>[5,6,7],1=>[8,9,10]]];
$result = array();
foreach( $y as $vals ){
foreach( $vals as $key => $val ){
$total[$key] = array_sum ( $val );
}
}
var_dump($total);
答案 3 :(得分:0)
要实现所需的输出,首先应该遍历数组并检查是否存在任何子数组,然后再使用array_walk_recursive()
函数遍历所有数组成员
<?php
$arr = [
[
'A' => [
'AA' => 3,
'BB' => 5,
'CC' => [
'DD' => 4,
'EE' => 5
]
],
'B' => [
'BA' => 2
]
],
[
'C' => [
'CC' => 3,
'CCC' => 2,
],
'D' => [
'DD' => 2
]
],
5,
[
2,
7
]
];
$arrSum = [];
$count = count($arr);
for ($i = 0; $i < $count; $i++) {
$sum = 0;
if(is_array($arr[$i])) {
array_walk_recursive($arr[$i], function ($item, $key) use (&$sum) {
$sum += $item;
});
}
else {
$sum += $arr[$i];
}
$arrSum [] = $sum;
$sum = 0;
}
var_dump($arrSum);