两数组id匹配时为array1新增ETA键的更优PHP实现方法
优化PHP数组按ID匹配合并的方案
嘿,我来帮你优化这个数组合并的问题!你的需求是把两个数组里id匹配的元素合并,给$array1的对应项加上ETA字段对吧?现在用的嵌套循环虽然能实现,但数组元素多了效率会下降,下面给你几个更高效简洁的实现方式:
先回顾你的原始数据和现有代码
原始数组
$array1 = array( [0] => array( 'id' => 'gdye6378399sjwui39', 'name' => 'Plate 1' ), [1] => array( 'id' => 'xyz6378399sjwui39', 'name' => 'Plate 2' ), [2] => array( 'id' => 'tr2e6378399sjwui39', 'name' => 'Plate 3' ) ); $array2 = array( [0] => array( 'id' => 'gdye6378399sjwui39', 'ETA' => '8' ), [1] => array( 'id' => 'tr2e6378399sjwui39', 'ETA' => '9' ), [2] => array( 'id' => 'xyz6378399sjwui39', 'ETA' => '5' ) );
现有实现(注:代码中$array12是$array2的笔误)
if(!empty($array2)) { foreach($array1 as $ck => $cl) { foreach($array12 as $ued){ if($cl['id'] == $ued['id']) { $array1[$ck]['ETA'] = $ued['ETA']; break; } } } }
更优的实现方法
方法一:先把$array2转成以id为键的关联数组(首推!)
这种方法的时间复杂度是O(n+m),比嵌套循环的O(n*m)高效太多,尤其是数组元素较多的时候。核心思路是先把$array2转成id => ETA的映射数组,之后遍历$array1直接通过id取值即可。
代码实现:
// 用PHP内置的*array_column()*快速构建id到ETA的映射数组(PHP5.5+支持) $etaMap = array_column($array2, 'ETA', 'id'); // 遍历$array1,给匹配的项添加ETA字段 foreach ($array1 as &$item) { if (isset($etaMap[$item['id']])) { $item['ETA'] = $etaMap[$item['id']]; } } unset($item); // 解除引用,避免后续操作意外修改数组元素
array_column()是PHP内置的高性能函数,比手动循环构建映射要快很多,代码也更简洁。
方法二:兼容低PHP版本的映射构建法
如果你的PHP版本低于5.5(不支持array_column()),可以用array_reduce()手动构建映射:
$etaMap = array_reduce($array2, function($carry, $item) { $carry[$item['id']] = $item['ETA']; return $carry; }, []); // 后续遍历赋值和方法一完全一样 foreach ($array1 as &$item) { if (isset($etaMap[$item['id']])) { $item['ETA'] = $etaMap[$item['id']]; } } unset($item);
方法三:函数式写法(适合小型数组)
如果数组元素不多,也可以用更偏向函数式编程的写法,虽然性能不如前两种,但代码更简洁:
$array1 = array_map(function($item) use ($array2) { // 从$array2中筛选出id匹配的元素 $match = array_filter($array2, function($etaItem) use ($item) { return $etaItem['id'] === $item['id']; }); // 如果找到匹配项,取出ETA赋值 if (!empty($match)) { $match = reset($match); $item['ETA'] = $match['ETA']; } return $item; }, $array1);
不过要注意,这种写法本质还是嵌套循环逻辑,数组大了效率会下降,适合小场景使用。
额外小技巧
如果$array1中存在id在$array2中没有匹配的情况,你可以给ETA设置默认值,比如用PHP7+的NULL合并运算符:
$item['ETA'] = $etaMap[$item['id']] ?? 'N/A';
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

