我的数组和
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
我认为我使用数组的方式是错误的,但我是新手,希望得到一些咨询。
提前致谢。
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;
看看下面的解决方案,希望它能帮助您获得想要的结果。 我使用迭代器来迭代数组:
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
array_sum()
期望将数组作为参数传递,因此如果您在打开 error_reporting
的情况下运行当前代码,它将返回以下内容:
E_WARNING :类型 2 -- array_sum() 期望参数 1 为数组,给定整数 -- 在第 10 行
您将数字 30 作为整数传递给需要数组的函数,因此它会出错并且不会返回您所期望的内容。
您可以在 PHP 手册中阅读该函数:
http://php.net/manual/en/function.array-sum.php
您可能还会发现错误报告页面很有帮助:
由于 array_sum() 适用于一维数组,因此它不适用于您的第一种和第三种情况。它仅适用于您的第二种情况,如下所示。
echo array_sum($teams[1]['区域 I']);
这是一个递归脚本,旨在在过滤时提供高度的灵活性。创建一个限定键数组作为路径。如果任何键符合给定级别,只需使用
null
作为该级别的限定键。
我知道的唯一限制是不支持部分密钥和每个级别的多个密钥。我必须在某个地方划清界限。
代码:(演示)
$filterSets = [
[],
[1],
[2],
[null, 'AREA I'],
[null, 'AREA II'],
[null, null, 'blue'],
[null, null, 'green'],
[null, 'AREA I', 'blue'],
];
function sumViaPath(array $array, array $path): int
{
$sum = 0;
$filterKey = $path ? array_shift($path) : null;
foreach ($array as $k => $v) {
if ($filterKey === null || $filterKey === $k) {
$sum += is_array($v) ? sumViaPath($v, $path) : $v;
}
}
return $sum;
}
foreach ($filterSets as $path) {
$results[json_encode($path)] = sumViaPath($teams, $path);
}
var_export($results);
输出:
array (
'[]' => 110,
'[1]' => 70,
'[2]' => 40,
'[null,"AREA I"]' => 95,
'[null,"AREA II"]' => 15,
'[null,null,"blue"]' => 85,
'[null,null,"green"]' => 25,
'[null,"AREA I","blue"]' => 70,
)