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

CodeIgniter4二维数组对比问题:列总和计算与重复值识别

问题解决与代码重构

核心需求梳理

  • 计算仅存在于array1但不在array2的行中,Fees和Service Charge的总和
  • 高亮展示上述结果中的重复跟踪号数据
  • 替换原有逻辑:从展示跟踪号匹配的行,改为展示仅在array1存在的行
  • 修复$fees和$service_charge的重复累加问题

重构后的代码

// 先提取array2中所有的跟踪号,用数组存储方便快速查找
$array2TrackingNumbers = [];
// 注意:假设array2的索引从10开始(原代码逻辑),如果实际是从0开始需要调整
for ($p = 10; $p <= count($array2); $p++) {
    $trackingNum = $array2[$p]['Tracking #'];
    $array2TrackingNumbers[$trackingNum] = true;
}

$fees = 0;
$service_charge = 0;
$resultArr = [];
$newIndex = 0;
// 记录重复的跟踪号,用于后续高亮
$duplicateTrackingNumbers = [];
$trackingCount = [];

// 遍历array1,筛选仅存在于array1的行
for ($u = 1; $u <= count($array1); $u++) {
    $currentTracking = $array1[$u]['Tracking Number'];
    // 判断当前行的跟踪号是否不在array2中
    if (!isset($array2TrackingNumbers[$currentTracking])) {
        // 统计跟踪号出现次数,用于标记重复
        if (isset($trackingCount[$currentTracking])) {
            $trackingCount[$currentTracking]++;
            $duplicateTrackingNumbers[$currentTracking] = true;
        } else {
            $trackingCount[$currentTracking] = 1;
        }

        // 累加符合条件的费用
        $chargeType = $array1[$u]['Charge'];
        $billedAmount = floatval($array1[$u]['Billed Charge']);
        if ($chargeType === "Fees") {
            $fees += $billedAmount;
        } elseif ($chargeType === "Service Charge") {
            $service_charge += $billedAmount;
        }

        // 收集符合条件的行数据
        $resultArr[$newIndex] = [
            "tracking_number" => $currentTracking,
            "service_type" => $chargeType,
            "amount" => $array1[$u]['Billed Charge'],
            "fees" => $fees,
            "service_charge" => $service_charge,
            "is_duplicate" => isset($duplicateTrackingNumbers[$currentTracking]) // 标记是否重复,用于高亮
        ];
        $newIndex++;
    }
}

关键优化点说明

  1. 避免嵌套循环,提升效率:
    先把array2的跟踪号存入一个关联数组,用isset()判断跟踪号是否存在,时间复杂度从O(n*m)降到O(n+m),数据量大时性能提升明显。

  2. 修复重复累加问题:
    只有当当前行符合「仅在array1存在」的条件时,才进行费用累加,避免了原代码中每次循环都累加导致的重复计算。

  3. 实现重复数据标记:
    通过$trackingCount统计每个跟踪号的出现次数,当次数≥2时标记为重复,后续展示时可根据is_duplicate字段进行高亮(比如前端用CSS样式,后端输出时添加HTML标签)。

  4. 逻辑替换为目标需求:
    完全替换原有的「匹配跟踪号」逻辑,改为筛选「仅在array1存在」的行,直接满足需求。

高亮重复数据的展示示例(PHP输出HTML为例)

echo "<table border='1'>";
echo "<tr><th>跟踪号</th><th>服务类型</th><th>金额</th><th>Fees总和</th><th>Service Charge总和</th></tr>";
foreach ($resultArr as $row) {
    $highlightClass = $row['is_duplicate'] ? 'style="background-color: #ffcccc;"' : '';
    echo "<tr {$highlightClass}>";
    echo "<td>{$row['tracking_number']}</td>";
    echo "<td>{$row['service_type']}</td>";
    echo "<td>{$row['amount']}</td>";
    echo "<td>{$fees}</td>"; // 注意:如果要每行显示累计到当前的总和就用$row['fees'],如果要显示最终总和就用全局的$fees
    echo "<td>{$service_charge}</td>";
    echo "</tr>";
}
echo "</table>";

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:05:25