我需要计算每个一级元素的深层元素的总和。
3级阵列示例:
[
1 => [
'A' => ['AA' => 3, 'AB' => 5],
'B' => ['BA' => 2]
],
2 => [
'C' => ['CA' => 4],
'D' => ['DA' => 1, 'DB' => 2]
],
3 => [
'E' => ['EA' => 1, 'EB' => 2, 'EC' => 3],
'F' => ['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的知识。
5条答案
按热度按时间dzhpxtsq1#
如果您想了解更多关于
foreach
的信息,下面是一个使用它的更详细的解决方案:var_dump(totalByCountry)
的结果:var_dump($total)
的结果:在真实的世界的项目中,你最好不要那么冗长,使用为这种情况而设计的php函数,比如array_walk_recursive(),就像Philipp Maurer和Firoz Ahmad的答案一样。
7rtdyuoh2#
foreach
的问题在于,数组有三层深,而foreach
只遍历第一层,array_sum()
只计算第二层。你前面的一个例子:
foreach
将迭代$total
数组。以下是示例的迭代:$key = 0
;$value = ['A'=>['AA'=>1,'AB'=>2], 'B'=>['BA'=>3,'BB'=>4]]
在循环中,然后在
$value
上调用array_sum()
。array_sum()
将所提供数组的子数组相加,如果它们是数值型的。不幸的是,$value
是一个二维数组,其子数组是数组,所以它们不是数值型的。这就是为什么为它返回0
。问题的一个解决方案是使用
array_walk_recursive()
函数,该函数遍历内部数组并在其上调用函数,您可以指定:指定的函数将数组中每个叶节点的值添加到指定的变量
$sum
中,该变量通过引用该函数而给定。bqjvbblv3#
打印$total,当进入foreach时,$瓦尔是一个数组。所以当调用array_sum函数时,它对第一个数组求和,并将总和赋给一个新数组的第一个元素。这就是它的工作方式。你的代码不工作的原因是,应该有一个foreach在你已经提供的foreach之外。从foreach的作用域之上删除这个foreach。
如果你的数组是三维的代码是这样的
icnyk63a4#
要获得所需的输出,首先应遍历数组并检查是否存在任何子数组,然后再次使用
array_walk_recursive()
函数遍历所有数组成员r3i60tvu5#
对于函数样式的解决方案,使用
array_map()
迭代第一级的数据集。然后压平剩余的水平,为
array_sum()
做准备。array_values()
目前是必需的,因为PHP还不允许解包非数字键数组。array_merge(...$variable)
用于使2D结构变平。代码:(Demo)