如何合并不同长度数组(含普通数组与对象数组):按匹配键整合重复数据
嘿,我来帮你搞定这个数组合并的问题!根据你的描述,你手里有一个对象数组和一个普通数组,想要基于唯一键(比如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
相关产品推荐
相关产品推荐

