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

两数组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:56:16