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++; } }
关键优化点说明
避免嵌套循环,提升效率:
先把array2的跟踪号存入一个关联数组,用isset()判断跟踪号是否存在,时间复杂度从O(n*m)降到O(n+m),数据量大时性能提升明显。修复重复累加问题:
只有当当前行符合「仅在array1存在」的条件时,才进行费用累加,避免了原代码中每次循环都累加导致的重复计算。实现重复数据标记:
通过$trackingCount统计每个跟踪号的出现次数,当次数≥2时标记为重复,后续展示时可根据is_duplicate字段进行高亮(比如前端用CSS样式,后端输出时添加HTML标签)。逻辑替换为目标需求:
完全替换原有的「匹配跟踪号」逻辑,改为筛选「仅在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
相关产品推荐
相关产品推荐

