You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:30:53