
本文详解如何在 php 中对数组进行逆序遍历,并计算从末尾开始的累积和(即每个位置对应原数组从该索引到末尾所有元素之和),提供可直接运行的代码、常见陷阱及优化写法。
本文详解如何在 php 中对数组进行逆序遍历,并计算从末尾开始的累积和(即每个位置对应原数组从该索引到末尾所有元素之和),提供可直接运行的代码、常见陷阱及优化写法。
在实际开发中,有时需要基于原始数组生成一个“后缀和”(suffix sum)数组——即第 i 个元素表示原数组从索引 i 到末尾所有值的总和。若进一步要求结果按逆序排列(即输出数组首项为原数组全部元素之和,末项为原数组最后一项),则需先反转数组,再逐项累加。
以下是一个清晰、健壮且符合 PHP 最佳实践的实现方式:
✅ 推荐写法:使用 array_reverse() + foreach 累加(推荐初学者)
<?php
$input = [6, 60, 38, 44, 44, 38, 60, 6];
$reversed = array_reverse($input); // [6, 60, 38, 44, 44, 38, 60, 6] → [6, 60, 38, 44, 44, 38, 60, 6] 实际不变?注意:本例输入对称,但逻辑通用
$output = [];
$sum = 0;
// 从反转后的数组开头开始累加(等价于原数组从尾到头累加)
foreach ($reversed as $value) {
$sum += $value;
array_unshift($output, $sum); // 前插确保结果顺序匹配需求
}
print_r($output);
// 输出:
// Array
// (
// [0] => 296
// [1] => 290
// [2] => 230
// [3] => 192
// [4] => 148
// [5] => 104
// [6] => 66
// [7] => 6
// )
?>? 关键说明:
- array_reverse($input) 得到原数组逆序副本;
- array_unshift() 将每次累加结果插入 $output 开头,使最终数组自然呈现“高位和在前”的期望结构;
- 使用 $sum 变量避免重复计算,时间复杂度 O(n),空间复杂度 O(n)。
⚠️ 注意事项与常见错误
-
❌ 错误示例(来自原始答案):
立即学习“PHP免费学习笔记(深入)”;
$input = array_reverse()[6,60,...]; // 语法错误!不能在函数调用后直接接数组字面量
正确应为 array_reverse([6,60,...])。
❌ 避免未初始化数组索引警告:
原始答案中 use (&$output) + $output[0] 在首次调用时会触发 Notice: Undefined offset: 0。应始终检查或改用更安全的累加逻辑(如上推荐写法)。-
✅ 更简洁替代方案(使用 array_reduce + 手动构建):
$input = [6, 60, 38, 44, 44, 38, 60, 6]; $suffixSums = []; $sum = 0; for ($i = count($input) - 1; $i >= 0; $i--) { $sum += $input[$i]; array_unshift($suffixSums, $sum); } print_r($suffixSums);
? 总结
- “逆序累加和”本质是后缀和的逆序输出,核心在于明确遍历方向与结果组织方式;
- 推荐优先使用显式 foreach 或 for 循环,逻辑直观、易调试、兼容性好;
- 避免依赖闭包变量状态或未初始化数组访问,确保代码在 E_ALL 错误级别下静默运行;
- 若需复用,可封装为函数:
function reverseCumulativeSum(array $arr): array { $result = []; $sum = 0; for ($i = count($arr) - 1; $i >= 0; $i--) { $sum += $arr[$i]; array_unshift($result, $sum); } return $result; }
掌握该技巧,可高效处理报表汇总、滚动统计、滑动窗口预计算等典型业务场景。



















