
本文详解如何在 php 中实现“逆序遍历输入数组,并生成从最后一个元素开始的累积和数组”,即每个输出值等于对应位置起始(含)到数组末尾所有元素之和,最终得到类似 [296, 290, 230, ..., 6] 的结果。
本文详解如何在 php 中实现“逆序遍历输入数组,并生成从最后一个元素开始的累积和数组”,即每个输出值等于对应位置起始(含)到数组末尾所有元素之和,最终得到类似 [296, 290, 230, ..., 6] 的结果。
该问题实质是求反向前缀和(reverse prefix sum):给定数组 [6,60,38,44,44,38,60,6],输出应为从右往左逐项累加的结果——即 output[i] = input[i] + input[i+1] + ... + input[n-1]。
例如:
- output[7] = 6(仅最后一项)
- output[6] = 60 + 6 = 66
- output[5] = 38 + 60 + 6 = 104
- …
- output[0] = 6 + 60 + 38 + 44 + 44 + 38 + 60 + 6 = 296
✅ 推荐实现方式(清晰、健壮、高效)
<?php
$input = [6, 60, 38, 44, 44, 38, 60, 6];
$n = count($input);
$output = array_fill(0, $n, 0);
// 从末尾向前遍历,构建反向累积和
for ($i = $n - 1; $i >= 0; $i--) {
$output[$i] = $input[$i] + ($i === $n - 1 ? 0 : $output[$i + 1]);
}
print_r($output);
?>输出结果:
Array
(
[0] => 296
[1] => 290
[2] => 230
[3] => 192
[4] => 148
[5] => 104
[6] => 66
[7] => 6
)⚠️ 注意事项与常见误区
- ❌ 原答案中 array_reverse()[...] 语法错误(PHP 不支持方括号直接调用函数返回值),应为 array_reverse($input);
- ❌ 使用 array_walk() + array_unshift() 效率低(每次 unshift 时间复杂度 O(n)),整体达 O(n²),不适用于大数组;
- ✅ 推荐的倒序循环法时间复杂度为 O(n),空间复杂度 O(n),逻辑直观且无警告风险;
- ✅ 若需原地修改或节省内存,可复用 $input 数组(但需确保原始数据无需保留);
- ✅ 对空数组或单元素数组,上述循环自动兼容,无需额外判断。
? 总结
反向累积和是常见数据处理需求(如余额滚动、剩余量统计等)。核心在于从右向左迭代,利用已计算的右侧和加速当前项计算。避免使用低效的插入操作或未定义索引访问,优先选择显式索引的线性扫描方案,兼顾可读性、性能与鲁棒性。

















