2016-01-20 126 views
0

我有我的数组问题和sum_array()函数。求和数组值

此代码无法正常工作。我已评论它应该打印什么。

$teams[1]['AREA I']['blue'] = 30; 
$teams[1]['AREA I']['green'] = 25; 
$teams[1]['AREA II']['blue'] = 15; 
$teams[2]['AREA I']['blue'] = 40; 

echo array_sum($teams[1]); // 30+25+15=70 
echo array_sum($teams[1]['AREA I']); // 30+25=55 
echo array_sum($teams[1]['AREA I']['blue']); // 30 

我想我使用阵列错误的方式,但我是新来的这个和一些咨询表示赞赏。

在此先感谢。

+0

是的,你正在使用'array_sum'错误的方式。 –

+1

看看我的回答,希望它会帮助你获得欲望的结果。 –

回答

1

看看下面的解决方案,希望它能帮助你得到欲望的结果。我使用迭代器迭代数组:

function getSum($array){ 
    if(is_array($array)) { 
     $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
     $sum = 0; 
     foreach ($iterator as $key => $value) { 
      $sum += $value; 
     } 
    } else{ 
     $sum = $array; 
    } 
    return $sum; 
} 

$teams = array(); 
$teams[1]['AREA I']['blue'] = 30; 
$teams[1]['AREA I']['green'] = 25; 
$teams[1]['AREA II']['blue'] = 15; 
$teams[2]['AREA I']['blue'] = 40; 

echo getSum($teams); //output: 110 
echo getSum($teams[1]); //output: 70 
echo getSum($teams[1]['AREA I']); //output: 55 
echo getSum($teams[1]['AREA I']['blue']); //output: 30 
+0

这正是我所期待的!谢谢! – lingo

+0

有什么办法可以跳过一些参数吗?所以,如果我不想设置任何特定区域,但我想设置颜色。然后脚本总结所有区域,但只有蓝色? – lingo

+0

你可以在'foreach'循环中的'$ key'的基础上添加条件 –

2

array_sum - 计算数组中值的总和。由于你的数组是多维的,所以你应该循环它。尝试如下:

$teams[1]['AREA I']['blue'] = 30; 
$teams[1]['AREA I']['green'] = 25; 
$teams[1]['AREA II']['blue'] = 15; 
$teams[2]['AREA I']['blue'] = 40; 
$sum = 0; 

foreach($teams as $num => $values) { 
    if(is_array($values)) 
    { 
     foreach($values as $num1 => $values1) { 
      $sum += array_sum($values1); 
     } 
    } 
} 
echo $sum; 
0

array_sum()预计数组作为参数传递,所以如果你有error_reporting运行当前的代码就可以切换会丢回如下:

E_WARNING:2型 - array_sum()期望参数1是数组,给定的整数 - 在第10行

您将数字30作为整数传递给期望数组的函数,因此它错误且不会'回报你期待。

http://php.net/manual/en/function.array-sum.php

您也可能会发现错误报告是否有帮助:

http://php.net/manual/en/function.error-reporting.php

0

由于array_sum()适用于

您可以在PHP手册中的函数读了一维数组,它不适用于你的第一和第三种情况。它只适用于第二种情况,如下所示。

echo array_sum($ teams [1] ['AREA I']);