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

PHP基于列值匹配多维数组中的对应元素

解决方案:按指定列匹配并合并PHP多维数组

这是日常开发中很常见的数组合并需求,我给你提供两种可行的方案,优先推荐第一种,效率更高:

方案一:转换为关联数组快速匹配(推荐)

这个思路是先把第二个数组转换成以name为键的关联数组,这样后续查找匹配项的速度会非常快,尤其适合数据量较大的场景:

步骤1:定义模拟数组(对应你提供的两个数组)

$array1 = [
    [
        'name' => 'John Doe',
        'education' => 'Finance',
        'age' => '23',
        'mark' => '10'
    ],
    [
        'name' => 'Jane Doe',
        'education' => 'History',
        'age' => '25',
        'mark' => '9'
    ],
    [
        'name' => 'Anne Smith',
        'education' => 'Computer Science',
        'age' => '22',
        'mark' => '8'
    ]
];

$array2 = [
    [
        'name' => 'Bob Builder',
        'country' => 'US',
        'city' => 'Massachusetts'
    ],
    [
        'name' => 'Jane Doe',
        'country' => 'France',
        'city' => 'Paris'
    ],
    [
        'name' => 'Anne Smith',
        'country' => 'Germany',
        'city' => 'Berlin'
    ]
];

步骤2:转换数组并合并匹配项

// 把第二个数组转成以name为键的关联数组,方便快速查找
$array2IndexedByName = array_column($array2, null, 'name');

$result = [];
foreach ($array1 as $item) {
    $currentName = $item['name'];
    // 检查第二个数组里有没有这个name的项
    if (isset($array2IndexedByName[$currentName])) {
        // 合并两个子数组,这里顺序是array2的项在前,array1的在后(如果有重复键,后面的会覆盖前面的,不过name是相同的不影响)
        $mergedItem = array_merge($array2IndexedByName[$currentName], $item);
        $result[] = $mergedItem;
    }
}

// 输出结果
print_r($result);

运行这段代码后,就能得到你想要的合并结果:Jane Doe和Anne Smith的所有字段都会被合并到同一个子数组里。

方案二:使用数组过滤和映射(适合小规模数据)

如果你的数组规模很小,也可以用更简洁的函数式写法,但效率不如第一种方案:

$result = array_filter(array_map(function($itemFromArray1) use ($array2) {
    // 在array2中找到匹配name的子数组
    $matchedItem = current(array_filter($array2, function($itemFromArray2) use ($itemFromArray1) {
        return $itemFromArray2['name'] === $itemFromArray1['name'];
    }));
    // 找到匹配项就合并,否则返回null(会被array_filter过滤掉)
    return $matchedItem ? array_merge($matchedItem, $itemFromArray1) : null;
}, $array1));

print_r($result);

两种方案的区别

  • 方案一的时间复杂度是O(n + m)(n是array1的长度,m是array2的长度),因为转换数组和遍历都是线性的,查找是O(1)的。
  • 方案二的时间复杂度是O(n * m),因为每次遍历array1的元素都要遍历一遍array2找匹配,数据量大的时候会慢很多。

所以优先选方案一就对啦!

内容的提问来源于stack exchange,提问作者Snowfire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:22:40