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

如何按指定关联键求多维数组交集并合并双方所有字段?

高效实现两个数组的关联字段合并

嘿,我懂你想要的效果——基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:57:42