
本文讲解如何在 php 中遍历多个查询返回的一维数组(每个数组含若干价格值),并将其全部元素累加得到最终总金额,重点解决因变量作用域错误导致的累加失效问题。
在实际开发中,我们常需根据订单项动态计算总价:例如,每个商品支持按小时或按天计费,且一个订单可能包含多个商品(ID 以逗号分隔),而每个商品又可能因租用时长不同产生多个价格组合(如 hour_rate + day_rate × 剩余天数)。此时,priceTotal() 方法会为每个商品 ID 返回一个价格数组(如 [420, 200]),而主逻辑需将所有商品返回的所有价格值统一累加,再叠加运费等附加费用。
但常见错误是将累加变量 $totalPrice 错误地声明在循环内部,导致每次迭代都重置为 0,仅保留最后一次循环的结果。正确做法是:将 $totalPrice = 0 提升至最外层作用域,在遍历所有订单项及其中每个商品前初始化一次。
以下是修正后的完整逻辑示例:
$weeklyGross = $chart->getChartInfo($conn, $weekly);
if (!empty($weeklyGross)) {
$totalPrice = 0; // ✅ 正确:全局累加器,初始化一次
foreach ($weeklyGross as $row) {
$hours = (int)$row['total_hours'];
$totalItems = $row['requested_items'];
$delivery_cost = (float)$row['delivery_cost'];
$items = array_map('trim', explode(',', $totalItems)); // 过滤空格,提升健壮性
foreach ($items as $var) {
$addItems = $chart->priceTotal($conn, $var, $hours);
if (is_array($addItems)) {
foreach ($addItems as $price) {
$totalPrice += (float)$price; // 强制类型转换,避免字符串拼接
}
}
}
$totalPrice += $delivery_cost; // 每个订单单独加运费
}
echo "本周总金额:¥" . number_format($totalPrice, 2);
} else {
echo "暂无订单数据";
}关键注意事项:
- ✅ 作用域控制:$totalPrice 必须定义在 foreach($weeklyGross as $row) 外部,否则每次进入新订单都会清零;
- ✅ 类型安全:对数据库读取的数值使用 (float) 显式转换,防止因字符串隐式转换导致意外拼接(如 "100" + "200" 得 300 是巧合,"100" + "abc" 则得 100);
- ✅ 数据清洗:使用 array_map('trim', ...) 清理 explode() 后可能存在的空格,避免无效 ID 查询;
- ✅ 空值防护:检查 $addItems 是否为数组再遍历,避免 foreach 报 Warning;
- ⚠️ 性能提示:当前方案对每个商品 ID 单独查询,若商品量大,建议重构为 IN 批量查询 + 关联计算,减少数据库往返。
通过以上调整,您即可准确汇总所有 print_r() 中显示的数组值(420+200+270+350+350+270+220+280+270+300+700+380+...),获得真正的订单总金额。










