对行结构不一致的多维数组的深层列值求和

问题描述 投票:0回答:5

我有一个最大深度为 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,
        ],
    ],
]
php arrays multidimensional-array sum
5个回答
3
投票

两个循环和一个辅助数组:

$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];
  }
}

1
投票

这应该有效:

$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

0
投票

我没有测试这段代码,但同时我不知道你是如何得到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;
}

0
投票

处理任何深度或数组结构,只需挑选带有您要查找的名称的术语:

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>);

0
投票

多维数组的第一级可以安全地忽略为不相关,因此

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,
)
© www.soinside.com 2019 - 2024. All rights reserved.