たとえば、次のような配列があります。
$cases = array(23, 18, 5, 8, 10, 16);
私が出力したいのは、実行中の合計です。
23, 41, 46, 54, 64, 80
明確にするための情報: この配列は現在、折れ線グラフに入力されています。私の目標は、毎日の累積的な進行状況を示す線を追加することです。(データはDBから来ているので、元の配列を変更することはできません)
たとえば、次のような配列があります。
$cases = array(23, 18, 5, 8, 10, 16);
私が出力したいのは、実行中の合計です。
23, 41, 46, 54, 64, 80
明確にするための情報: この配列は現在、折れ線グラフに入力されています。私の目標は、毎日の累積的な進行状況を示す線を追加することです。(データはDBから来ているので、元の配列を変更することはできません)
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);
とのちょっとした線array_map
。配列を反復処理し、実際の合計をインクリメントして返します。
$actual_sum = 0;
$running_total = array_map(function ($entry) use (&$actual_sum) { return $actual_sum += $entry; }, $cases);
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);
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);
$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);
Aaaaand 別のバリエーションarray_walk
、私見が最も自然です:
$cases = array(23, 18, 5, 8, 10, 16);
$totals = array();
array_walk($cases, function($v) use (&$totals) {$totals[] = end($totals) + $v;});
<?
$total = array();
$points = array(23, 18, 5, 8, 10, 16);
while ($points) {
$total[] = array_shift($points);
echo 'point: '.array_sum($total);
}
?>