如何在PHP中匹配两个多维数组的ID?
PHP数组按ID匹配合并的解决方法
嘿,针对你这两个需要按ID匹配合并的PHP数组,我给你整理了几种实用的解决办法,都是日常开发里常用的,你可以根据自己的PHP版本和数组规模来选:
方法一:高效键映射法(推荐)
这种方法先把第二个数组转换成以id为键的关联数组,后续查找匹配项的效率是O(1),特别适合处理大数据量的情况。
// 先将$dizi2转换为以id为键的数组,快速定位生日数据 $dizi2ById = array_column($dizi2, null, 'id'); // 遍历$dizi1,匹配对应ID的生日信息 foreach ($dizi1 as &$user) { // 检查是否存在对应ID的生日数据,存在则合并 if (isset($dizi2ById[$user['id']]['birthday'])) { $user['birthday'] = $dizi2ById[$user['id']]['birthday']; } } unset($user); // 释放引用,防止后续代码意外修改原数组元素 // 输出合并后的结果 print_r($dizi1);
说明:array_column($dizi2, null, 'id')会把$dizi2里的每个元素以其id值作为新数组的键,这样我们不需要嵌套循环,直接通过ID就能快速找到对应的生日数据,性能比嵌套循环好很多。
方法二:PHP 7.4+简洁写法
如果你用的是PHP 7.4及以上版本,可以结合箭头函数和null合并运算符,写出更简洁的代码:
// 先提取$dizi2里的id和生日,生成id=>birthday的映射 $birthdayMap = array_column($dizi2, 'birthday', 'id'); // 用array_map遍历$dizi1,合并生日数据 $mergedArray = array_map(fn($user) => array_merge($user, [ 'birthday' => $birthdayMap[$user['id']] ?? null ]), $dizi1); print_r($mergedArray);
说明:?? null是null合并运算符,当对应ID的生日不存在时,会给birthday赋值为null,避免出现未定义索引的警告。箭头函数让代码更紧凑,可读性也不错。
方法三:基础嵌套循环法(适合小数组)
如果你的数组规模很小,也可以用最直观的嵌套循环来实现,虽然性能不如前两种,但胜在容易理解:
foreach ($dizi1 as &$user) { foreach ($dizi2 as $birthdayData) { if ($user['id'] === $birthdayData['id']) { $user['birthday'] = $birthdayData['birthday']; break; // 找到匹配项后立即跳出内层循环,减少不必要的遍历 } } } unset($user); print_r($dizi1);
说明:这种方法需要两层循环,数组元素越多,性能越差,所以只推荐在处理少量数据时使用。
内容的提问来源于stack exchange,提问作者Cugurel
相关产品推荐
相关产品推荐

