php数组之和

时间:2011-09-02 17:04:35

标签: php arrays

我有以下多个级别的数组。我希望得到[价格],[成年人]和[儿童]的总和,但却无法遍历这些水平。

我应该用这个例子得到的答案是price=380 adults=5 and children=1

Array ( 
    [8] => Array ( 
        [2] => Array ( 
            [num_rooms] => 2 
            [adults] => Array ( 
                [0] => 1 
                [1] => 1 
             ) 
             [children] => Array ( 
                 [0] => 0 
                 [1] => 0 
             ) 
             [prices] => Array ( 
                 [0] => 50 
                 [1] => 50 
             ) 
             [price] => 130 
             [supp] => 30 
         ) 
         [3] => Array ( 
             [num_rooms] => 1 
             [adults] => Array ( 
                 [0] => 1 
             ) 
             [prices] => Array ( 
                 [0] => 100 
             ) 
             [price] => 150 
             [supp] => 50 
         ) 
     ) 
     [1] => Array ( 
         [2] => Array ( 
             [num_rooms] => 2 
             [adults] => Array ( 
                 [0] => 1 
                 [1] => 1 
             ) 
             [children] => Array ( 
                 [0] => 1 
                 [1] => 0 
             ) 
             [prices] => Array ( 
                 [0] => 75 
                 [1] => 75 
             ) 
             [price] => 170 
             [supp] => 20 
         )
     )
 )

由于

4 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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>);

答案 3 :(得分: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;
}