【问题标题】:Calculating the average increase from array values in PHP计算 PHP 中数组值的平均增长
【发布时间】:2013-03-07 13:47:20
【问题描述】:

我需要计算数组值的平均增加量,并且我制作了一个可以工作的小脚本,但我想知道:

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

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

提前致谢:)

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

【问题讨论】:

    标签: php arrays average


    【解决方案1】:

    这个怎么样:

    function moving_average($array) {
    
    for ($i = 1; $i < sizeof($array); $i++) {
        $result[] = $array[$i] - $array[$i-1];
    }
    
    return array_sum($result)/count($result);
    }
    

    【讨论】:

    • 这也很好用,是我原始循环的一个更简洁的版本,谢谢!
    • 一些测试表明这是最快的方法,所以谢谢。如果我可以将您的答案标记为我愿意的答案,但我真的很喜欢@silkfire 的答案
    • 那么,您愿意放弃速度来支持单线吗? ;-)
    • 你让我感觉很糟糕。我总是追求速度,并且会使用你的代码,所以我想答案应该交给你?
    • 谢谢,我很感激 ;-)
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 效果很好,将与@silkfire 答案进行基准测试,看看哪个更有效。谢谢!
    【解决方案3】:

    这是一个适合你的时髦单行:

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

    【讨论】:

      【解决方案4】:
      $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)

      【讨论】:

        猜你喜欢
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 2014-05-14
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多