我需要计算数组值的平均增长量,并且我制作了一个可行的小脚本,但我想知道是否:
假设我有一个像这样的数组:
$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);
这里的逻辑是否正确,是否有一种更有效的方法,可能没有循环?
提前致谢:)
编辑:更新了代码以排除第一个值
答案 0 :(得分:3)
这个怎么样:
function moving_average($array) {
for ($i = 1; $i < sizeof($array); $i++) {
$result[] = $array[$i] - $array[$i-1];
}
return array_sum($result)/count($result);
}
答案 1 :(得分: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);
答案 2 :(得分: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));
答案 3 :(得分: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)