如何计算Array中的运行总计。 PHP

时间:2013-06-03 16:53:16

标签: php

我有一个数组,例如:

$cases = array(23, 18, 5, 8, 10, 16);

我想要的输出是一个运行总计:

23, 41, 46, 54, 64, 80

有助于澄清的一些信息:此数组目前正在填充折线图,我的目标是尝试添加一行显示每天的累积进度。 (数据来自数据库,因此我无法更改原始数组)

8 个答案:

答案 0 :(得分:10)

最简单的方法,O(n)复杂度:

$original = array(23, 18, 5, 8, 10, 16);

$total = array();
$runningSum = 0;

foreach ($original as $number) {
    $runningSum += $number;
    $total[] = $runningSum;
}

var_dump($total);

答案 1 :(得分:7)

array_map的一点点。它迭代数组,递增实际总和并返回它。

$actual_sum = 0;
$running_total = array_map(function ($entry) use (&$actual_sum) { return $actual_sum += $entry; }, $cases);

答案 2 :(得分:4)

介绍RunningTotalIterator解决方案,主要是为了补充其他答案而写的:

class RunningTotalIterator extends ArrayIterator
{
    private $sum;

    public function rewind()
    {
        parent::rewind();
        $this->sum = $this->valid() ? parent::current() : 0;
    }

    public function current()
    {
        return $this->sum;
    }

    public function next()
    {
        parent::next();
        if ($this->valid()) {
            $this->sum += parent::current();
        }
    }
}

$result = iterator_to_array(new RunningTotalIterator(array(23, 18, 5, 8, 10, 16)));
print_r($result);

答案 3 :(得分:4)

使用生成器(新的5.5功能):

function getRunningTotal(array $array) {
    $generator = function(array $array) {
        $total = 0;
        foreach ($array as $key => $value) {
            $total += $value;
            yield $key => $total;
        }
    };
    return iterator_to_array($generator($array));
}

如果您想将结果保留为迭代器,只需直接返回$generator($array) ...

这种方式的工作方式是,引擎在内部创建一个生成器(其作用类似于迭代器),并返回"无论得到什么。因此,通过将自己的运行总量保持在函数内部,我们可以"产生"它回到来电者。很直接......

答案 4 :(得分:3)

array_sum()会返回添加的数组中所有数字的总和,但如果您想要running total,请转到:

$total = array();
$original = array(23, 18, 5, 8, 10, 16);

foreach($original as $number)
{
    $total[] = array_sum($total)+$number;
}

print_r($total);

答案 5 :(得分:2)

$cases = array(23, 18, 5, 8, 10, 16);
$running = array_reduce(
    $cases,
    function ($counter, $value) {
        static $summer = 0;
        $summer += $value;
        $counter[] = $summer;
        return $counter;
    },
    array()
);

var_dump($running);

答案 6 :(得分:2)

Aaaa和array_walk的另一种变体,恕我直言最自然:

$cases = array(23, 18, 5, 8, 10, 16);
$totals = array();
array_walk($cases, function($v) use (&$totals) {$totals[] = end($totals) + $v;});

<强> See it in action

答案 7 :(得分:1)

<?
$total = array();
$points = array(23, 18, 5, 8, 10, 16);

while ($points) {
 $total[] = array_shift($points);
 echo 'point: '.array_sum($total);
}
?>