
本文讲解如何在遍历 json 解析后的商品数组时,按指定 id 分类统计各品类数量,并将其他商品归入“other”组,最终准确汇总全部商品件数。
本文讲解如何在遍历 json 解析后的商品数组时,按指定 id 分类统计各品类数量,并将其他商品归入“other”组,最终准确汇总全部商品件数。
在 PHP 开发中,常需对订单数据(如 JSON 格式)进行分类渲染与数量统计。常见误区是仅用 ++ 对计数器自增(即每条记录计为 1),而忽略了字段 quantite(数量)本身可能大于 1 —— 这正是原代码中总和仅为 7(记录条数)而非预期 26(实际商品件数)的根本原因。
要实现「1 item 77777、3 items 88888、5 items 99999、17 other items、total 26 items」的统计效果,关键在于:使用关联数组 $counts 作为累加器,以商品 ID(如 77777)为键,以 quantite 的数值为增量进行累加,而非简单计数。
以下是优化后的核心逻辑(已适配您的数据结构):
$data = $commande;
$decode = json_decode($data);
$mailData1 = $mailData2 = $mailData3 = $mailData4 = '';
$counts = [];
foreach ($decode as $curr_element) {
$fieldName = $curr_element->nom;
$fieldQty = (int)$curr_element->quantite; // 强制转为整型,避免字符串累加
$fieldPrice = $curr_element->prix;
if ($fieldQty > 0 && $fieldPrice != 0) {
$commonHtml = '<div style="border:solid; margin-bottom:1rem;">' .
'<div style="float:left;width:50%;">voici le nom</div>' .
'<div style="">'. htmlspecialchars($fieldName) .'</div>' .
'<div style="float:left;width:50%;">qanditée</div>' .
'<div style="">'. $fieldQty .'</div>' .
'</div><br>';
if ($fieldName == 77777) {
$mailData1 .= $commonHtml;
$counts[77777] = ($counts[77777] ?? 0) + $fieldQty;
} elseif ($fieldName == 88888) {
$mailData2 .= $commonHtml;
$counts[88888] = ($counts[88888] ?? 0) + $fieldQty;
} elseif ($fieldName == 99999) {
$mailData3 .= $commonHtml;
$counts['other'] = ($counts['other'] ?? 0) + $fieldQty;
} else {
$mailData4 .= $commonHtml;
$counts['other'] = ($counts['other'] ?? 0) + $fieldQty;
}
}
}
// 计算总计(含所有分组)
$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\n";
✅ 关键改进点说明:
- 使用
$counts[$key] += $fieldQty替代$counts[$key]++,真正按商品数量累加; - 初始化
$counts['other']并统一处理非匹配项,避免遗漏(原代码中99999分支误写为$counts['other']++,且未覆盖全部else场景); - 使用空合并操作符
?? 0替代@抑制错误,更安全、更现代; - 对输出内容使用
htmlspecialchars()防止 XSS,增强安全性; - 将重复 HTML 提取为
$commonHtml变量,提升可维护性。
⚠️ 注意事项:
- 确保
quantite字段为数字类型(建议 JSON 中使用整数而非字符串"1"),否则需显式(int)转换; - 若需按数量降序排列分组结果,可在最后使用
arsort($counts); - “other”组应严格定义为 既非 77777/88888/99999,又满足
$fieldQty > 0 && $fieldPrice != 0条件 的商品,逻辑须与业务一致。
通过以上重构,您将获得准确的商品件数统计:77777→1, 88888→3, 99999→5, other→17, 总计 26 —— 完全匹配预期目标。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











