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

这里的逻辑是否正确,是否有更有效的方法来做到这一点,也许没有循环?

提前致谢 :)

编辑:更新代码以考虑排除第一个值

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

于 2013-03-07T14:51:46.833 回答