滑动平均值在php中可通过固定窗口遍历实现,核心是控制边界、避免越界;基础方法用array_sum计算每窗均值,优化版采用增量更新将时间复杂度从o(n×w)降至o(n),并需处理空数组、非法窗口及非数字值等异常情况。

滑动平均值(Moving Average)在 PHP 中可以通过遍历数组、对每个窗口内的元素求和再除以窗口大小来实现。核心是控制窗口边界,避免越界,同时兼顾性能和可读性。
基础滑动平均:固定窗口大小
给定数组和窗口长度 $windowSize,从索引 0 开始,每次取连续 $windowSize 个元素计算平均值,直到无法取满一窗为止。
- 窗口数 = count($arr) - $windowSize + 1(当 $windowSize ≤ count($arr))
- 用 for 循环控制起始索引 $i,子数组为 array_slice($arr, $i, $windowSize)
- 推荐用 array_sum() + count() 计算均值,简洁且兼容关联/索引数组(只要值为数字)
处理边界与异常情况
实际使用中需主动防御:
- 若 $windowSize 或大于数组长度,直接返回空数组或抛出 InvalidArgumentException
- 数组为空时返回空数组
- 窗口内存在非数字值(如 null、string)会导致警告或错误结果,建议提前过滤或类型转换:(float)$val
- 如需保留小数精度,可用 round($avg, $precision),例如保留两位小数
优化:避免重复求和(适用于大数组)
基础方法每次调用 array_sum() 会重新遍历窗口,时间复杂度 O(n×w)。可改用“增量更新”降为 O(n):
立即学习“PHP免费学习笔记(深入)”;
- 先算第一个窗口总和 $sum
- 后续每步:减去离开窗口的元素,加上进入窗口的新元素
- 示例逻辑:$sum = $sum - $arr[$i-1] + $arr[$i + $windowSize - 1](注意索引偏移)
- 该方式要求数组为数字索引且连续,不适用于稀疏或关联键数组
封装成可复用函数
一个健壮的函数示例:
function slidingAverage(array $arr, int $windowSize, int $precision = 2): array
{
if ($windowSize <= 0 || empty($arr)) {
return [];
}
$len = count($arr);
if ($windowSize > $len) {
return [];
}
<pre class='brush:php;toolbar:false;'>$result = [];
// 第一个窗口求和
$sum = array_sum(array_map('floatval', array_slice($arr, 0, $windowSize)));
$result[] = round($sum / $windowSize, $precision);
// 增量更新
for ($i = 1; $i <= $len - $windowSize; $i++) {
$sum = $sum - floatval($arr[$i - 1]) + floatval($arr[$i + $windowSize - 1]);
$result[] = round($sum / $windowSize, $precision);
}
return $result;}











