2013-03-07 86 views
1

我需要計算陣列值的平均增幅,而我做了一個小腳本的工作,但我想知道:從計算陣列值的平均增幅在PHP

  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); 

是邏輯正確的位置,並沒有這樣做,也許不循環的更有效的方法?

感謝提前:)

編輯:更新後的代碼要佔不包括第一個值

回答

2

這個怎麼樣:

function moving_average($array) { 

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

return array_sum($result)/count($result); 
} 
+0

這工作得很好,我的原始循環更整潔,謝謝! – 2013-03-07 14:28:59

+0

有些測試表明這是最快的方法,所以謝謝。如果我能將你的答案標記爲我的答案,但我真的會挖掘@ silkfire的答案 – 2013-03-07 14:33:31

+0

的時髦性,那麼,你願意放棄速度而贊成單線? ;-) – unicorn80 2013-03-07 14:37:19

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); 
+0

工作得非常好,將基準對這個答案@silkfire,看看哪一個更有效。謝謝! – 2013-03-07 14:24:12

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)); 
+1

的確非常時髦!我很喜歡這個,謝謝。 – 2013-03-07 14:23:34

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浮法(3.0994415283203E-5)