PHP循环统计商品数量异常:总数计算不符问题求助
PHP订单数据分类统计问题排查与修复
问题诊断
原代码存在以下关键问题,导致统计结果不符合预期:
- JSON数据格式错误:提供的订单JSON末尾有多余的
1,会导致json_decode解析失败或得到错误的数组结构 - 计数逻辑错误:使用
$counts[$fieldName]++仅统计商品的条目数量,而非累加quantite字段的实际商品数量 - 分支逻辑错误:99999的处理分支中,错误地同时对目标分类和
other分类计数,导致重复统计 - 错误抑制符滥用:
@符号掩盖了未定义索引的警告,不利于调试问题 - 变量名笔误:99999分支中出现未定义的
$mailData变量,属于无效代码
修正方案
1. 修复JSON数据
移除JSON末尾多余的1,正确的JSON如下:
[{"nom":2005,"prix":1.1,"quantite":"1","url":"https://phil.pecheperle.be/image-perles/perle-verre-peche-gardon-2005.JPG"},{"nom":2003,"prix":0.55,"quantite":"5","url":"https://phil.pecheperle.be/image-perles/perle-verre-peche-gardon-2003.JPG"},{"nom":2002,"prix":0.55,"quantite":"9","url":"https://phil.pecheperle.be/image-perles/perle-verre-peche-gardon-2002.JPG"},{"nom":77777,"prix":11,"quantite":"1","url":"https://phil.pecheperle.be/image-perles/pack_debutant-peche-perle-redimensionnee.jpg"},{"nom":88888,"prix":22,"quantite":"3","url":"https://phil.pecheperle.be/image-perles/pack_confirme-peche-perle-redimensionnee.jpg"},{"nom":99999,"prix":33,"quantite":"5","url":"https://phil.pecheperle.be/image-perles/mega-pack-peche-perle-redimensionnee.jpg"}]
2. 修正后的PHP代码
$datanom = $commande; // 解析JSON为关联数组,同时检查解析结果 $decodenom = json_decode($datanom, true); if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析错误: " . json_last_error_msg()); } $mailData1 = ""; $mailData2 = ""; $mailData3 = ""; $mailData4 = ""; // 初始化计数数组,避免未定义索引 $counts = [ 77777 => 0, 88888 => 0, 99999 => 0, 'other' => 0 ]; foreach ($decodenom as $curr_elementnom) { $fieldName = $curr_elementnom['nom']; // 转换为整数,确保数量是数字类型 $fieldQty = (int)$curr_elementnom['quantite']; $fieldPrice = $curr_elementnom['prix']; $fieldimg = $curr_elementnom['url']; // 过滤数量或价格为0的条目 if ($fieldQty > 0 && $fieldPrice > 0) { switch ($fieldName) { case 77777: $input = '<div style="border:solid;"> <div style="float: left;width: 50%;"> voici le nom</div> <div>' . $fieldName . '</div> <div style="float: left;width: 50%;"> quantité</div> <div>' . $fieldQty . '</div> </div><br><br><br>'; $mailData1 .= $input; $counts[77777] += $fieldQty; break; case 88888: $input = '<div style="border:solid;"> <div style="float: left;width: 50%;"> voici le nom</div> <div>' . $fieldName . '</div> <div style="float: left;width: 50%;"> quantité</div> <div>' . $fieldQty . '</div> </div><br><br><br>'; $mailData2 .= $input; $counts[88888] += $fieldQty; break; case 99999: $input = '<div style="border:solid;"> <div style="float: left;width: 50%;"> quantité</div> <div>' . $fieldQty . '</div> <div style="float: left;width: 50%;"> voici le nom</div> <div>' . $fieldName . '</div> </div><br><br><br>'; $mailData3 .= $input; $counts[99999] += $fieldQty; break; default: $input = '<div style="border:solid;"> <div style="float: left;width: 50%;"> quantité</div> <div>' . $fieldQty . '</div> <div style="float: left;width: 50%;"> voici le nom</div> <div>' . $fieldName . '</div> </div><br><br><br>'; $mailData4 .= $input; $counts['other'] += $fieldQty; break; } } } // 输出调试信息 var_dump($mailData1); var_dump($mailData2); var_dump($mailData3); var_dump($mailData4); var_dump($counts); $totalperles = array_sum($counts); echo "总计: {$totalperles} items\n";
3. 关键修改说明
- 添加JSON解析错误检查,避免无效数据导致的逻辑异常
- 初始化计数数组默认值,移除
@错误抑制符,便于调试 - 将计数逻辑从
++改为累加$fieldQty,实现按实际商品数量统计 - 修正99999分支的重复计数问题,删除无效的
$mailData变量赋值 - 将
quantite转换为整数类型,确保数值计算准确
预期输出
运行修正后的代码,会得到符合预期的统计结果:
array(1) { [77777]=> int(1) } array(1) { [88888]=> int(3) } array(1) { [99999]=> int(5) } array(1) { ["other"]=> int(15) } 总计: 24 items
内容的提问来源于stack exchange,提问作者philippe
相关产品推荐
相关产品推荐

