基于共享ID列合并两个二维关联数组的高效方案
高效合并两个共享ID的大数组方案
这种大数据量(4万条+)的数组合并,双重foreach循环确实是性能杀手——O(n²)的时间复杂度在数据量上来后基本没法用。我给你一个O(n+m)的高效方案,核心是先把其中一个数组转成以ID为键的索引数组,这样查找匹配的时间复杂度直接降到O(1),整体效率会提升几个数量级。
具体步骤
将$array2转换为以ID为键的关联数组
用array_column可以快速完成这个转换,把每个子数组的ID作为外层数组的键,子数组本身作为值。这样后续查找ID对应的元素时,不需要遍历整个数组,直接通过键访问即可。遍历$array1,匹配合并元素
遍历$array1的每个元素,用其ID去查找刚才转换好的$array2索引数组,如果存在对应的条目,就合并两个子数组的键值对,存入结果数组。
完整代码示例
<?php $array1 = [ ["ID" => "AAAA", "Name" => "Apple"], ["ID" => "BBBB", "Name" => "Avocado"], ["ID" => "CCCC", "Name" => "Banana"] ]; $array2 = [ [ "ID" => "AAAA", "Taste" => "Yumi", "Location" => "France", "Price" => "Cheap" ], [ "ID" => "CCCC", "Taste" => "Yumi", "Location" => "Africa", "Price" => "Cheap" ], [ "ID" => "BBBB", "Taste" => "Yumi", "Location" => "America", "Price" => "Expensive" ], [ "ID" => "HZGA", "Taste" => "Berk", "Location" => "Moon", "Price" => "Expensive" ] ]; // 步骤1:将array2转为以ID为键的数组 $array2Indexed = array_column($array2, null, 'ID'); // 步骤2:遍历array1,合并匹配的元素 $finalArray = []; foreach ($array1 as $item) { $id = $item['ID']; // 只保留两个数组都存在的ID条目 if (isset($array2Indexed[$id])) { $finalArray[] = array_merge($item, $array2Indexed[$id]); } } // 输出结果 print_r($finalArray); ?>
为什么这个方案高效?
- 转换数组的过程是一次线性遍历,时间复杂度O(m)(m是$array2的长度)
- 遍历合并的过程也是一次线性遍历,时间复杂度O(n)(n是$array1的长度)
- 总时间复杂度是O(n+m),对于4万条数据来说,总操作次数只有8万左右,和双重循环的16亿次操作完全不在一个量级。
额外说明
- 如果$array1中存在重复的ID,你可能需要先对$array1去重(比如用
array_column先转成ID为键的数组再转回来),避免结果中出现重复条目。 - 结果数组的顺序和$array1的顺序一致,如果你需要按ID排序,可以最后对$finalArray做一次排序操作。
内容的提问来源于stack exchange,提问作者Sh3yn3
相关产品推荐
相关产品推荐

