我有一个最大深度为 4 级的多维数组,但并非所有列都存在于较低级别中,并且某些列包含子集而不是原始值。
我需要计算列值的总和。
我希望获得[价格]、[成人]和[儿童]的总和,但无法遍历各个级别。
通过这个例子我应该得到的答案是
price=380 adults=5 and children=1
。
这是我的输入数组:
[
8 => [
2 => [
'num_rooms' => 2,
'adults' => [1, 1],
'children' => [0, 0],
'prices' => [50, 50],
'price' => 130,
'supp' => 30,
],
3 => [
'num_rooms' => 1,
'adults' => [1],
'prices' => [100],
'price' => 150,
'supp' => 50,
],
],
1 => [
2 => [
'num_rooms' => 2,
'adults' => [1, 1],
'children' => [1, 0],
'prices' => [75, 75],
'price' => 170,
'supp' => 20,
],
],
]
两个循环和一个辅助数组:
$sums = array ( 'price' => 0, 'adults' => 0, 'children' => 0 );
foreach($array as $outer) {
foreach($outer as $inner) {
$sums['price'] += $inner['price'];
$sums['adults'] += array_sum($inner['adults']);
$sums['children'] += array_sum($inner['children']);
}
}
print_r($sums);
具有更动态版本的内循环:
foreach($array as $outer) {
foreach($outer as $inner) {
foreach($sums as $key => &$v)
$v += is_array($inner[$key])
? array_sum($inner[$key])
: $inner[$key];
}
}
这应该有效:
$price = 0;
$adults = 0;
$children = 0;
foreach($arr as $l1_key => $l1_value) // iterates over the first level array
{
foreach($l1_value as $l2_key => $l2_value) // iterates over second level arrays
{
$price += $l2_value['price']; // add up price totals
foreach($l2_value['adults'] as $value) // iterate through adults array values
{
$adults += $value; // sum up adult count
}
foreach($l2_value['children'] as $value) // iterate through children array values
{
$children += $value; // sum up children count
}
}
}
// now $price, $adults, and $children contain the totals for each
我没有测试这段代码,但同时我不知道你是如何得到380的..我看到的是350?
$sums = getSum($arr);
print_r($sums);
function getSum($arr) {
$sums = array();
$sums2 = array();
$sums['adults'] = 0;
$sums2['adults'] = 0;
$sums['children'] = 0;
$sums2['children'] = 0;
$sums['prices'] = 0;
$sums2['prices'] = 0;
foreach ($arr as $key => $value) {
$do_not_recurse = false;
switch ($key) {
case 'adults':
$do_not_recurse = true;
foreach ($value as $adults)
$sums['adults'] += $adults;
break;
case 'children':
$do_not_recurse = true;
foreach ($value as $children)
$sums['children'] += $children;
break;
case 'prices':
$do_not_recurse = true;
foreach ($value as $price)
$sums['prices'] += $price;
break;
default:
break;
}
if (is_array($value))
$sums2 = getSum($value);
}
$sums['adults'] += $sums2['adults'];
$sums['children'] += $sums2['children'];
$sums['prices'] += $sums2['prices'];
return $sums;
}
处理任何深度或数组结构,只需挑选带有您要查找的名称的术语:
function find($term, $array) {
$count = 0;
foreach ($array as $item)
if (is_array($item)) $count += find($term, $item);
if (isset($array[$term]) {
if (is_array($array[$term])) $count += array_sum($array[$term]);
else $count += $array[$term];
}
return $count;
}
echo count('price', <the array>);
echo count('adults', <the array>);
echo count('children', <the array>);
多维数组的第一级可以安全地忽略为不相关,因此
array_merge(...$array)
可以用来展平结构,而无需编写 foreach()
并声明额外的变量。
要迭代下一个级别并对每列动态执行总计,您可以将每个值转换为数组(为了一致性),然后将该总和添加到该列之前存储的值中。
解释无条件转换:
代码:(演示)
$result = [];
foreach (array_merge(...$array) as $row) {
foreach ($row as $k => $v) {
$result[$k] = ($result[$k] ?? 0) + array_sum((array) $v);
}
}
var_export($result);
输出:
array (
'num_rooms' => 5,
'adults' => 5,
'children' => 1,
'prices' => 350,
'price' => 450,
'supp' => 100,
)