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

如何合并含相同键值对的两个数组,其余元素转为多维数组

嘿,我完全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:37:16