我有一个数组,例如:
$cases = array(23, 18, 5, 8, 10, 16);
我想要的输出是一个运行总计:
23, 41, 46, 54, 64, 80
有助于澄清的一些信息:此数组目前正在填充折线图,我的目标是尝试添加一行显示每天的累积进度。 (数据来自数据库,因此我无法更改原始数组)
答案 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);
}
?>