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

如何合并不同长度数组(含普通数组与对象数组):按匹配键整合重复数据

嘿,我来帮你搞定这个数组合并的问题!根据你的描述,你手里有一个对象数组和一个普通数组,想要基于唯一键(比如key字段)把它们合并,而且在键匹配的位置要保留重复的数据对吧?刚好我对这种场景很熟悉,给你一步步拆解解决方案~

解决方案思路

核心思路是先把其中一个数组转换成以唯一键为索引的关联数组,这样能快速定位匹配项,然后遍历另一个数组完成合并,同时保留重复的匹配条目:

  • 第一步:把普通数组转换成以key为键的关联数组,方便后续快速查找
  • 第二步:遍历对象数组,对每个对象检查是否有匹配的key,有就合并数据,没有就保留原对象
  • 可选步骤:如果需要把普通数组中未匹配到的元素也加入结果,额外处理即可

代码实现(PHP)

先补全你的示例数组(假设普通数组的结构是包含key字段的关联数组):

// 你的对象数组
$arr1 = [
    (object)["id" => 1, "key" => 1, "content" => "blah", "extra" => "extra data"],
    (object)["id" => 2, "key" => 2, "content" => "bleep", "extra" => "extra data"],
    (object)["id" => 3, "key" => 3, "content" => "bloop", "extra" => "extra data"],
    (object)["id" => 4, "key" => 2, "content" => "duplicate bleep", "extra" => "extra data"]
];

// 普通数组示例
$arr2 = [
    ["key" => 2, "new_content" => "updated bleep content"],
    ["key" => 3, "new_content" => "updated bloop content"],
    ["key" => 5, "new_content" => "brand new item content"]
];

1. 把普通数组转为键索引的关联数组

这一步是为了避免嵌套遍历,提升匹配效率:

$arr2Indexed = [];
foreach ($arr2 as $item) {
    $key = $item['key'];
    // 如果普通数组有多个相同key的元素,可以存为数组,这里默认保留最后一个
    $arr2Indexed[$key] = $item;
}

2. 合并数组并保留重复匹配项

遍历对象数组,逐个匹配合并:

$mergedArray = [];

foreach ($arr1 as $obj) {
    $currentKey = $obj->key;
    // 将对象转为数组以便合并操作
    $objArray = (array)$obj;
    
    // 找到匹配的key就合并数据
    if (isset($arr2Indexed[$currentKey])) {
        // 合并后转回对象,普通数组字段会覆盖对象同名字段(按需调整)
        $mergedArray[] = (object)array_merge($objArray, $arr2Indexed[$currentKey]);
    } else {
        // 无匹配则保留原对象
        $mergedArray[] = $obj;
    }
}

// 可选:把普通数组中未匹配到的元素也加入结果
foreach ($arr2Indexed as $key => $item) {
    $hasMatch = false;
    foreach ($arr1 as $obj) {
        if ($obj->key == $key) {
            $hasMatch = true;
            break;
        }
    }
    if (!$hasMatch) {
        $mergedArray[] = (object)$item;
    }
}

查看合并结果

执行print_r($mergedArray)后,你会看到:

  • 对象数组中key=2的两个重复条目都和普通数组的对应项完成了合并
  • 未匹配的原对象和普通数组新元素都被保留

关键细节说明

  • 重复数据保留:对象数组中所有匹配到key的条目都会被单独合并,完全满足你保留重复数据的需求
  • 字段覆盖控制:如果不想让普通数组的字段覆盖对象原有字段,可以把array_merge改成自定义的字段添加逻辑,比如判断字段不存在再赋值
  • 结构适配:如果你的普通数组是纯索引数组(比如直接对应key的值),只需要调整arr2Indexed的生成逻辑即可适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:25