如何将子数组合并到主数组?PHP嵌套数组合并问题
解决方案:对应索引合并嵌套数组
你的问题核心是将两个嵌套数组按对应索引合并子元素,而array_merge($arr1, $arr2)之所以不符合预期,是因为它会把两个数组的顶层元素直接拼接(比如主数组2个元素+子数组2个元素=4个元素),而不是把对应位置的子数组合并。
针对大数据量的性能需求,这里提供两个高效的线性时间复杂度(O(n))方案,内存占用低且执行高效:
方案一:foreach引用遍历(推荐,内存友好)
直接在原主数组上修改,不需要创建额外的大数组,适合数据量较大的场景:
$mainArray = [ ['FirmId' => 1, 'PartyName' => 'abc medicals', 'PartyCode' => 'P001', 'SalesmanName' => ''], ['FirmId' => 2, 'PartyName' => 'xyz medicals', 'PartyCode' => 'P001', 'SalesmanName' => ''] ]; $subArray = [ ['SalesmanName' => 'abc'], ['SalesmanName' => 'xyz'] ]; // 使用引用遍历,直接修改原数组元素 foreach ($mainArray as $index => &$item) { // 先检查子数组对应索引是否存在,避免索引越界警告 if (isset($subArray[$index])) { $item = array_merge($item, $subArray[$index]); } } unset($item); // 解除引用,防止后续操作意外修改数组 print_r($mainArray);
执行后会得到你预期的结果,而且因为是直接修改原数组,内存开销极小。
方案二:array_map简洁实现
如果希望生成新数组而不修改原数组,可以用array_map,代码更简洁,性能和foreach相当:
$mergedArray = array_map(function($mainItem, $subItem) { // 合并对应位置的子数组,子数组的键会覆盖主数组的同名键(正好符合你的需求) return array_merge($mainItem, $subItem ?? []); }, $mainArray, $subArray); print_r($mergedArray);
这里用$subItem ?? []处理子数组比主数组短的情况,避免array_merge接收null参数报错。
关键说明
array_merge($a, $b)在子数组层面使用时,会将两个子数组的键合并,子数组的同名键会覆盖主数组的键,这正好符合你需要填充SalesmanName的需求。- 两个方案都是线性遍历,是处理这类问题的最优性能方案——因为必须遍历每个元素一次,不存在比O(n)更快的方法。
内容的提问来源于stack exchange,提问作者Juned Ansari
相关产品推荐
相关产品推荐

