
本文详解如何在 php 循环中准确统计不同商品编号对应的数量总和(而非仅计数出现次数),并通过关联数组实现分组累加,最终得出各类别及总计数量。
本文详解如何在 php 循环中准确统计不同商品编号对应的数量总和(而非仅计数出现次数),并通过关联数组实现分组累加,最终得出各类别及总计数量。
在处理订单类 JSON 数据时,一个常见误区是将“统计商品数量”理解为 统计某商品出现的行数(即 ++$counts[$id]),而实际业务需求往往是 统计该商品的总采购件数(即累加 quantite 字段值)。从你提供的示例数据可见:
[
{"nom":2005,"quantite":"1"},
{"nom":88888,"quantite":"3"},
{"nom":99999,"quantite":"5"},
{"nom":2002,"quantite":"9"},
{"nom":77777,"quantite":"1"},
{"nom":2001,"quantite":"9"}
]期望结果是 1 + 3 + 5 + 9 + 1 + 9 = 28(注:原始描述中“total 26”与样例数据略有出入,以代码逻辑为准),但原代码使用 @$counts[$fieldName]++ 仅对每个匹配项加 1,导致结果为 7(共 7 条记录),完全偏离业务含义。
✅ 正确做法:用 $fieldQty 做数值累加
关键修改在于:
- 将
@$counts[$fieldName]++替换为@$counts[$fieldName] += (int)$fieldQty; - 确保
$fieldQty被安全转换为整型(JSON 中可能为字符串); - 统一归类逻辑:
77777、88888、99999单独计数,其余全部归入'other'; - 最终用
array_sum($counts)获取总数。
以下是优化后的核心逻辑(已精简冗余 HTML 并增强健壮性):
$data = $commande;
$decode = json_decode($data);
$counts = ['77777' => 0, '88888' => 0, '99999' => 0, 'other' => 0];
$mailData1 = $mailData2 = $mailData3 = $mailData4 = '';
foreach ($decode as $item) {
// 安全提取字段,避免 Notice
$fieldName = $item->nom ?? null;
$fieldQty = (int)($item->quantite ?? 0);
$fieldPrice = (float)($item->prix ?? 0);
if ($fieldQty <= 0 || $fieldPrice <= 0) continue;
$qty = $fieldQty; // 明确语义
if ($fieldName == 77777) {
$mailData1 .= generateItemHtml($fieldName, $qty);
$counts[77777] += $qty;
} elseif ($fieldName == 88888) {
$mailData2 .= generateItemHtml($fieldName, $qty);
$counts[88888] += $qty;
} elseif ($fieldName == 99999) {
$mailData3 .= generateItemHtml($fieldName, $qty);
$counts['other'] += $qty; // 注意:此处按需求归入 other
} else {
$mailData4 .= generateItemHtml($fieldName, $qty);
$counts['other'] += $qty;
}
}
// 辅助函数:避免重复 HTML 拼接
function generateItemHtml($name, $qty) {
return <<<HTML
<div style="border:solid; margin-bottom:1rem;">
<div style="float:left;width:50%;">voici le nom</div>
<div>{$name}</div>
<div style="float:left;width:50%;">quantité</div>
<div>{$qty}</div>
<div style="clear:both;"></div>
</div>
HTML;
}
$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";⚠️ 注意事项
-
类型安全:
$fieldQty来自 JSON,可能是字符串"3",务必用(int)强转,避免字符串连接(如"1"+"2"→"12"); -
空值防护:使用
??运算符防止null导致的 Warning; -
CSS 清除浮动:示例中添加
<div style="clear:both;"></div>修复浮动布局塌陷; - 可维护性:将 HTML 生成抽离为函数,便于后续样式/结构升级;
-
调试建议:用
var_dump($counts)验证各键值是否符合预期,再计算array_sum()。
通过以上重构,你将得到真正反映业务含义的统计结果——不是“多少种商品”,而是“总共多少件商品”。

















