如何合并含相同键值对的两个数组,其余元素转为多维数组
嘿,我完全get到你的需求了——要把两个数组里拥有相同键值对(比如你示例里的sequence_number)的元素合并成一个,而那些只在其中一个数组里存在的元素,统一放到多维数组里对吧?我给你分两种场景来实现,你可以根据自己的实际情况选:
场景1:合并相同元素,保留所有元素在一个数组里
这种是把所有元素都放在一个数组中,相同标识的元素合并成一个,不同的直接保留:
首先,咱们先定义示例数组(模拟你给的$array1和对应的$array2):
$array1 = [ [ 'sequence_number' => 2541, 'name' => 'Damodhara', 'connection_date' => '2018-03-16 12:19:41', 'comm_address' => '', 'meter_no' => 34347, 'connection_name' => 'DOMESTIC', 'ward_name' => 'ALAPE', 'corp_name' => 'Corp1', 'agent_name' => 'agent' ], [ 'sequence_number' => 2543, 'name' => 'Jane Smith', 'connection_date' => '2018-05-10 14:20:00' ] ]; $array2 = [ [ 'sequence_number' => 2541, 'phone' => '1234567890', 'email' => 'damodhara@example.com' ], [ 'sequence_number' => 2542, 'name' => 'John Doe', 'connection_date' => '2018-04-20 09:30:00' ] ];
然后是核心的合并逻辑:
// 用sequence_number作为唯一标识,先把array1转成以它为键的临时数组 $tempMerged = []; foreach ($array1 as $item) { $key = $item['sequence_number']; $tempMerged[$key] = $item; } // 遍历array2,合并相同标识的元素,添加新元素 foreach ($array2 as $item) { $key = $item['sequence_number']; if (isset($tempMerged[$key])) { // 合并键值对,若有重复键,$array2的值会覆盖$array1的(可根据需求调整) $tempMerged[$key] = array_merge($tempMerged[$key], $item); } else { $tempMerged[$key] = $item; } } // 转回数字索引数组,和原数组结构一致 $finalArray = array_values($tempMerged); // 查看结果 print_r($finalArray);
场景2:分离合并元素与未匹配元素
如果你想把合并后的相同元素和只在单个数组里的元素分开,未匹配的放到一个多维数组里,可以这么写:
// 先收集两个数组的所有sequence_number,方便后续判断 $keysInArray1 = array_column($array1, 'sequence_number'); $keysInArray2 = array_column($array2, 'sequence_number'); $mergedItems = []; $unmatchedItems = []; // 处理array1里的元素,合并匹配项,收集未匹配项 foreach ($array1 as $item) { $key = $item['sequence_number']; if (in_array($key, $keysInArray2)) { // 找到array2里对应的元素 $matchedItem = current(array_filter($array2, function($i) use ($key) { return $i['sequence_number'] === $key; })); // 合并两个元素 $mergedItems[] = array_merge($item, $matchedItem); } else { $unmatchedItems[] = $item; } } // 把array2里独有的元素也加入未匹配数组 foreach ($array2 as $item) { $key = $item['sequence_number']; if (!in_array($key, $keysInArray1)) { $unmatchedItems[] = $item; } } // 输出结果 echo "合并后的匹配元素:\n"; print_r($mergedItems); echo "\n未匹配的元素(多维数组):\n"; print_r($unmatchedItems);
额外小技巧:避免重复键覆盖
如果两个数组的元素有相同的键(比如都有name),上面的array_merge会用后面的值覆盖前面的。如果你想把相同键的值转成数组而不是覆盖,可以用这个自定义合并函数:
function mergeWithoutOverwrite($arr1, $arr2) { $result = $arr1; foreach ($arr2 as $key => $value) { if (isset($result[$key])) { // 先把已有值转成数组(如果还不是的话) if (!is_array($result[$key])) { $result[$key] = [$result[$key]]; } $result[$key][] = $value; } else { $result[$key] = $value; } } return $result; }
然后把代码里的array_merge替换成mergeWithoutOverwrite就行啦。
内容的提问来源于stack exchange,提问作者austin
相关产品推荐
相关产品推荐

