如何按指定关联键求多维数组交集并合并双方所有字段?
高效实现两个数组的关联字段合并
嘿,我懂你想要的效果——基于id(arr1)和cid(arr2)的匹配关系,把两个数组的字段合并到一起。你之前用array_uintersect_uassoc没达到预期,是因为这个函数的核心是找键值都匹配的交集元素,但只会保留第一个数组的内容,根本不会合并第二个数组的字段,所以它并不适合这个场景。
高效实现方案
咱们换个思路:先把arr2转换成以cid为键的关联数组(快速查找的映射表),再遍历arr1进行匹配合并,这样时间复杂度是O(n+m),比嵌套循环的O(n*m)高效得多,尤其是数据量大的时候优势明显。
完整代码示例:
<?php $arr1 = [ ['id' => 1, 'country' => 'US', 'user_name' => 'test1'], ['id' => 2, 'country' => 'UK', 'user_name' => 'test2'], ['id' => 3, 'country' => 'IT', 'user_name' => 'test3'] ]; $arr2 = [ ['cid' => 1, 'orders' => 100, 'views' => 3 ], ['cid' => 3, 'orders' => 200, 'views' => 4 ], ]; // 步骤1:将arr2转为以cid为键的映射数组,O(m)时间复杂度 $arr2Map = array_column($arr2, null, 'cid'); // 步骤2:遍历arr1,匹配并合并字段,O(n)时间复杂度 $res = []; foreach ($arr1 as $item) { $currentId = $item['id']; // 如果当前id在arr2的映射中存在,就合并两个数组的字段 if (isset($arr2Map[$currentId])) { $merged = array_merge($item, $arr2Map[$currentId]); // 可选:如果不需要保留cid字段,这里可以删除 unset($merged['cid']); $res[] = $merged; } } // 输出结果 print_r($res); ?>
执行后得到的结果完全符合你的预期:
Array ( [0] => Array ( [id] => 1 [country] => US [user_name] => test1 [orders] => 100 [views] => 3 ) [1] => Array ( [id] => 3 [country] => IT [user_name] => test3 [orders] => 200 [views] => 4 ) )
为什么这个方法高效?
array_column构建映射表的过程是线性时间O(m),m是arr2的元素数量;- 遍历arr1的过程是线性时间O(n),n是arr1的元素数量;
- 整体时间复杂度是O(n+m),比嵌套循环逐一比对的O(n*m)快得多,数据量越大差距越明显。
内容的提问来源于stack exchange,提问作者Yuval Kaufman
相关产品推荐
相关产品推荐

