[英]Sum each row's deep values in a 3-dimensional array
我需要计算每个第一级元素的深层元素的总和。
示例 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。
您想了解更多关于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
-编辑-
在现实世界的项目中,最好不要那么冗长,而使用针对此类情况的php函数,例如array_walk_recursive() ,如Philipp Maurer和Firoz Ahmad的回答。
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
数组。 这是示例的迭代过程:
$key = 0
; $value = ['A'=>['AA'=>1,'AB'=>2], 'B'=>['BA'=>3,'BB'=>4]]
$value
上调用array_sum()
。 array_sum()
将提供的数组的array_sum()
如果是数字的话array_sum()
相加。 遗憾的是, $value
是一个二维数组,其子级是数组,因此它们不是数字。 这就是为此返回0
原因。 解决您的问题的方法是使用array_walk_recursive()
函数,该函数遍历内部数组并在内部数组上调用一个函数,您可以指定:
$sum = 0;
array_walk_recursive($total, function($value) use (&$sum) {
$sum += $value;
});
指定的函数将数组中每个叶子的值添加到指定的变量$sum
,该变量由对该函数的引用给出。
打印$ 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);
为了获得所需的输出,首先您应该遍历数组并检查是否存在子数组,然后再次使用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);
对于函数式解决方案,使用array_map()
迭代第一级的数据集。
然后压平剩余的水平,为array_sum()
做准备。
array_values()
目前是必需的,因为 PHP 还不允许解包非数字键的 arrays。
array_merge(...$variable)
用于展平二维结构。
代码:(演示)
var_export(
array_map(
fn($set) => array_sum(array_merge(...array_values($set))),
$array
)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.