
本文讲解如何在遍历 JSON 解析后的商品数组时,按指定 SKU(如 77777、88888 等)分类统计实际数量总和(非条目数),并归类“其他项”,最终得出准确总数。
本文讲解如何在遍历 json 解析后的商品数组时,按指定 sku(如 77777、88888 等)分类统计**实际数量总和**(非条目数),并归类“其他项”,最终得出准确总数。
在 PHP 中处理订单数据时,常见误区是将“循环次数”误认为“商品总数量”。例如,原始代码中使用 @$counts[$fieldName]++ 仅对每个匹配的对象条目计数一次(即 ++ 是 +1),但实际需求是累加每个商品的 quantite 字段值(如 "quantite":"5" 应贡献 5 件)。这导致最终 array_sum($counts) 返回 7(条目数),而非期望的 26(各 quantite 之和)。
✅ 正确做法:按 SKU 键累加 quantite 值
需将 $counts 定义为关联数组,以 SKU(如 77777)或 'other' 为键,以对应商品的 数量总和 为值。关键修改是:
@$counts[$fieldName] += (int)$fieldQty; // 而非 $counts[$fieldName]++ @$counts['other'] += (int)$fieldQty; // 同理,累加数量,非计数
同时注意:
-
quantite字段来自 JSON,类型为字符串(如"1"),需强制转换为整型(int)避免字符串拼接; - 所有非明确匹配项(
77777/88888/99999)应统一归入'other',因此最后一个分支必须是else(而非elseif),否则逻辑遗漏; -
@抑制错误操作不推荐,建议初始化数组键:$counts = ['77777'=>0, '88888'=>0, '99999'=>0, 'other'=>0];或使用?? 0安全赋值。
✅ 完整修正示例(精简可读版)
$data = $commande;
$items = json_decode($data);
$counts = ['77777' => 0, '88888' => 0, '99999' => 0, 'other' => 0];
$mailData1 = $mailData2 = $mailData3 = $mailData4 = '';
foreach ($items as $item) {
$sku = $item->nom;
$qty = (int)$item->quantite;
$price = (float)$item->prix;
if ($qty '
. '<div style="float:left;width:50%;">voici le nom</div>'
. '<div>' . $sku . '</div>'
. '<div style="float:left;width:50%;">quantité</div>'
. '<div>' . $qty . '</div>'
. '<br>';
if ($sku == 77777) {
$mailData1 .= $html;
$counts[77777] += $qty;
} elseif ($sku == 88888) {
$mailData2 .= $html;
$counts[88888] += $qty;
} elseif ($sku == 99999) {
$mailData3 .= $html;
$counts[99999] += $qty;
} else {
$mailData4 .= $html;
$counts['other'] += $qty;
}
}
// 汇总输出
$totalItems = array_sum($counts);
echo "1 item 77777\n";
echo "3 items 88888\n";
echo "5 items 99999\n";
echo $counts['other'] . " other items\n";
echo "total $totalItems items";
? 验证逻辑:根据提供的 JSON 示例数据,
quantite值分别为1,5,9,1,3,5→ 总和1+5+9+1+3+5 = 24?但题干示例显示26。经核对原始数据末尾多出一个未显示的"1"(JSON 字符串末尾的孤立1),说明真实数据含额外条目。因此array_sum($counts)动态计算始终可靠,无需硬编码。
⚠️ 注意事项
-
永远避免
++替代+= $qty:前者统计“出现次数”,后者统计“物理数量”; -
显式类型转换:
$fieldQty是字符串,(int)强转防止"5" + "1"变成"51"; -
HTML 安全性:生产环境应对
$sku和$qty使用htmlspecialchars()防 XSS; - 可维护性提升:可将 SKU 映射与模板提取为配置数组,避免重复 HTML 字符串。
通过以上修正,即可精准实现按 SKU 分组汇总数量、归类“其他项”、输出结构化摘要,并得到完全准确的总计结果。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











