如何合并经Explode拆分的数据集并累加相同ID的amount值
解决PHP合并ID相同条目并累加数量的问题
首先咱们先梳理下现有代码的核心问题:
- 嵌套
while循环逻辑有漏洞:外层循环遍历第一个数据集时,内层循环的$j变量没有重置,导致第二次外层循环时$j已经超出第二个数据集的长度,无法正常遍历 - 没有正确处理「仅在单个数据集中存在的条目」,会出现遗漏或重复添加的情况
- 用
$array_status判断合并状态的逻辑不准确,无法精准区分合并与新增条目
下面是修复后的代码,逻辑更清晰,能准确实现需求:
<?php $data1 = "144|aku|1!!!122|dia|2"; $data2 = "144|aku|1!!!211|dia|1"; // 初始化一个以ID为键的关联数组,方便快速判断条目是否存在 $mergedItems = []; // 处理第一个数据集的所有条目 foreach (explode('!!!', $data1) as $itemStr) { list($id, $name, $amount) = explode('|', $itemStr); $amount = (int)$amount; // 确保数量是整数类型 if (isset($mergedItems[$id])) { // ID已存在,累加数量 $mergedItems[$id]['amount'] += $amount; } else { // ID不存在,新增条目 $mergedItems[$id] = [ 'name' => $name, 'amount' => $amount ]; } } // 处理第二个数据集的所有条目 foreach (explode('!!!', $data2) as $itemStr) { list($id, $name, $amount) = explode('|', $itemStr); $amount = (int)$amount; if (isset($mergedItems[$id])) { $mergedItems[$id]['amount'] += $amount; } else { $mergedItems[$id] = [ 'name' => $name, 'amount' => $amount ]; } } // 将处理后的关联数组转回要求的字符串格式 $resultArray = []; foreach ($mergedItems as $id => $itemInfo) { $resultArray[] = "$id|{$itemInfo['name']}|{$itemInfo['amount']}"; } $data_result = implode('!!!', $resultArray); echo $data_result; // 输出:144|aku|2!!!122|dia|2!!!211|dia|1 ?>
代码逻辑说明:
- 转换为关联数组:用ID作为数组键名,能快速判断条目是否已存在,避免了原代码嵌套循环的混乱
- 累加与新增:遍历两个数据集时,存在的ID直接累加数量,不存在的ID则新增条目
- 转回目标格式:遍历处理后的数组,把每个条目拼接成
id|name|amount格式,再用!!!连接成最终字符串
这种方法不仅逻辑清晰,还能高效处理所有边界情况,比如条目仅在单个数据集中存在的场景。
内容的提问来源于stack exchange,提问作者Avista Kautsar
相关产品推荐
相关产品推荐

