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

PHP合并两个数组:保留原数组名为子键的实现问题

How to Merge Arrays by Keys with Preserving Original Array Names as Subkeys in PHP

我明白你的需求了——你希望把两个数组按照它们的顶级键(比如mobile、tv)合并,并且每个顶级键下面要保留原数组的名字(array1和array2)作为子键,分别存放对应原数组里的内容。但array_merge_recursive()确实做不到这一点,它只会把同键的数组合并成一个扁平的列表,这和你的预期不符。

原数组示例

$array1 = array(
    'mobile' => array(
        array('item' => 'apple','price' => 4),
        array('item' => 'nokia','price' => 39),
        array('item' => 'samsung','price' => 8)
    ),
    'tv' => array(
        array('item' => 'LG','price' => 39),
        array('item' => 'max', 'price' => 8 ),
        array('item' => 'diaken','price' => 3 )
    )
);

$array2 = array(
    'mobile' => array(
        array('item' => 'HTC','price' => 4 ),
        array('item' => 'OnePlus' ,'price' => 39),
        array('item' => 'Nexus','price' => 8 )
    ),
    'tv' => array(
        array('item' => 'LG','price' => 39),
        array('item' => 'Panasonic','price' => 8 ),
        array('item' => 'Toshiba' ,'price' => 3 )
    )
);

你的预期输出

array(
    'mobile' => array(
        'array1' => array(
            '0' => array('item' => 'apple','price' => 4),
            '1' => array('item' => 'nokia','price' => 39),
            '2' => array('item' => 'samsung','price' => 8),
        ),
        'array2' => array(
            '0' => array('item' => 'HTC','price' => 4),
            '1' => array('item' => 'OnePlus','price' => 39),
            '2' => array('item' => 'Nexus','price' => 8)
        )
    ),
    'tv' => array(
        'array1' => array(
            '0' => array('item' => 'LG','price' => 39),
            '1' => array('item' => 'max','price' => 8),
            '2' => array('item' => 'diaken','price' => 3)
        ),
        'array2' => array(
            '0' => array('item' => 'LG','price' => 39),
            '1' => array('item' => 'Panasonic','price' => 8),
            '2' => array('item' => 'Toshiba','price' => 3)
        )
    )
)

array_merge_recursive()的问题

这个函数会把同键的数组元素直接合并到一个数组中,结果是扁平的,没有保留原数组的标识:

Array (
    'mobile' => Array (
        Array('item' => 'apple','price' => 4),
        Array('item' => 'nokia','price' => 39),
        Array('item' => 'samsung','price' => 8),
        Array('item' => 'HTC','price' => 4 ),
        Array('item' => 'OnePlus' ,'price' => 39),
        Array('item' => 'Nexus','price' => 8 ),
    ),
    'tv' => Array (
        Array('item' => 'LG','price' => 39),
        Array('item' => 'max', 'price' => 8 ),
        Array('item' => 'diaken','price' => 3 ),
        Array('item' => 'LG','price' => 39),
        Array('item' => 'Panasonic','price' => 8 ),
        Array('item' => 'Toshiba' ,'price' => 3 )
    )
)

解决方案:自定义合并函数

我们可以写一个简单的函数来实现你的需求,逻辑是遍历两个数组的所有顶级键,为每个键创建包含array1和array2子键的结构:

function mergeWithOriginalKeys($array1, $array2) {
    // 获取两个数组的所有顶级键的并集
    $allKeys = array_unique(array_merge(array_keys($array1), array_keys($array2)));
    $result = [];

    foreach ($allKeys as $key) {
        // 从array1中获取对应值,不存在则设为空数组
        $val1 = isset($array1[$key]) ? $array1[$key] : [];
        // 从array2中获取对应值,不存在则设为空数组
        $val2 = isset($array2[$key]) ? $array2[$key] : [];

        $result[$key] = [
            'array1' => $val1,
            'array2' => $val2
        ];
    }

    return $result;
}

测试函数

调用这个函数并打印结果:

$mergedArray = mergeWithOriginalKeys($array1, $array2);
print_r($mergedArray);

执行后,输出的结果就会和你预期的完全一致,每个顶级键下都保留了array1和array2作为子键,分别存放原数组的对应内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:50:46