对数组值求和

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

我的数组和

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

我认为我使用数组的方式是错误的,但我是新手,希望得到一些咨询。

提前致谢。

php arrays sum
5个回答
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;

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
投票

array_sum()
期望将数组作为参数传递,因此如果您在打开
error_reporting
的情况下运行当前代码,它将返回以下内容:

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

您将数字 30 作为整数传递给需要数组的函数,因此它会出错并且不会返回您所期望的内容。

您可以在 PHP 手册中阅读该函数:

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

您可能还会发现错误报告页面很有帮助:

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


0
投票

由于 array_sum() 适用于一维数组,因此它不适用于您的第一种和第三种情况。它仅适用于您的第二种情况,如下所示。

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


0
投票

这是一个递归脚本,旨在在过滤时提供高度的灵活性。创建一个限定键数组作为路径。如果任何键符合给定级别,只需使用

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