3

たとえば、次のような配列があります。

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

私が出力したいのは、実行中の合計です。

23, 41, 46, 54, 64, 80

明確にするための情報: この配列は現在、折れ線グラフに入力されています。私の目標は、毎日の累積的な進行状況を示す線を追加することです。(データはDBから来ているので、元の配列を変更することはできません)

4

8 に答える 8

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);
于 2013-06-03T17:03:46.593 に答える
8

とのちょっとした線array_map。配列を反復処理し、実際の合計をインクリメントして返します。

$actual_sum = 0;
$running_total = array_map(function ($entry) use (&$actual_sum) { return $actual_sum += $entry; }, $cases);
于 2013-06-03T17:00:59.230 に答える
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);
于 2013-06-03T17:15:43.140 に答える
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);
于 2013-06-03T16:55:23.693 に答える
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);
于 2013-06-03T17:03:12.063 に答える
2

Aaaaand 別のバリエーションarray_walk、私見が最も自然です:

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

実際に見てください

于 2013-06-03T17:05:52.860 に答える
1
<?
$total = array();
$points = array(23, 18, 5, 8, 10, 16);

while ($points) {
 $total[] = array_shift($points);
 echo 'point: '.array_sum($total);
}
?>
于 2013-06-03T16:59:07.310 に答える