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
相关产品推荐
相关产品推荐

