1

配列値の平均増加を計算する必要があり、機能する小さなスクリプトを作成しましたが、次のことを知りたいです:

  1. これを行うためのより良い、より効率的な方法があります
  2. 私の論理はここで平均増加を計算するのに正しいです

次のような配列があるとしましょう。

$array = array(5,10,15,10,0,15);

また、各配列項目が 1 日であり、値がその日のカウンターであると想像してみましょう。カウンターの平均増減を計算したいと思います。

私が行ったことは、配列をループし、値を変更して、現在のアイテム = 現在のアイテム - 前のアイテムになるようにします。次のような配列が残っています。

$array = array(5,5,-5,-10,15);

次に、通常どおりに平均を計算します。この例では、毎日平均 2 増加します。

ここにコード:

$array = array(5,10,15,10,0,15);
$count = count($array);

for($i=0;$i<$count;$i++) {
    if($i==0) {
        $value = $array[$i];
        unset($array[$i]);
    }
    else {
        $tmp = $array[$i];
        $array[$i] -= $value;
        $value = $tmp;
    }
}

echo array_sum($array) / count($array);

ここでのロジックは正しいですか?おそらくループなしで、これを行うより効率的な方法はありますか?

前もって感謝します :)

EDIT:最初の値を除外するためにコードを更新しました

4

4 に答える 4

3

これはどう:

function moving_average($array) {

for ($i = 1; $i < sizeof($array); $i++) {
    $result[] = $array[$i] - $array[$i-1];
}

return array_sum($result)/count($result);
}
于 2013-03-07T14:26:50.097 に答える
1

これを試して :

$array       = array(5,10,15,10,0,15);
$array2      = $array;

array_pop($array2);
array_unshift($array2, $array[0]);
$subtracted  = array_map(function ($x, $y) { return $y-$x; } , $array2, $array);
array_shift($subtracted); /// Comment this if you want six values with 0 as first value

echo array_sum($subtracted) / count($subtracted);
于 2013-03-07T14:16:18.890 に答える
1

これはあなたのためのおしゃれなワンライナーです:

$days = array(5, 10, 15, 10, 0, 15);

$deltas = array_slice(array_map(function($day1, $day2) {
    return $day2 - $day1;
}, $days, array_slice($days, 1)), 0, -1);

var_dump(array_sum($deltas) / count($deltas));
于 2013-03-07T14:19:13.420 に答える
0
$array = array(5,10,15,10,0,15);
list($prevVal) = array_slice($array, 1);

array_walk($array, function($value, $key, &$prevVal)  use(&$array){
    if ($key==0) { return; }
    $array[$key] = ($value - $prevVal);
    $prevVal = $value;
}, $prevVal);

echo array_sum($array) / count($array);

出力 1.6666666666667 in float(3.0994415283203E-5)

于 2013-03-07T14:51:46.833 に答える