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

PHP嵌套数组合并失败求助:如何实现指定结构的数组合并

问题:PHP多维数组深层合并失败

我有两个JSON格式的数据,转换为PHP数组后尝试合并但未成功,以下是我的PHP代码:

$arr1 = json_decode('{
   "PatchDeployment":[{
         "ehubid":"123",
         "tomcats":[{
               "tomcatname":"mytomcat",
               "servername":"myserver",
               "serverip":"xx.xx.xx.xxx",
               "tomcat_statuses":{"stoptomcat":"Success"}
            }]
      }]
}', true);


$arr2 = json_decode('{
   "PatchDeployment":[{
         "ehubid":"123",
         "tomcats":[{
               "tomcatname":"mytomcat",
               "servername":"myserver",
               "serverip":"xx.xx.xx.xxx",
               "tomcat_statuses":{"checkdb":"Failed","checkhub":"couldnt connect to host"}
            }]
      }]
}', true);


$mergedarray = array_merge($arr1, $arr2);

我期望合并后的数组结构如下:

Array
(
    [PatchDeployment] => Array
        (
            [0] => Array
                (
                    [ehubid] => 123
                    [tomcats] => Array
                        (
                            [0] => Array
                                (
                                    [tomcatname] => mytomcat
                                    [servername] => myserver
                                    [serverip] => xx.xx.xx.xxx
                                    [tomcat_statuses] => Array
                                        (
                                            [checkdb] => Failed
                                            [checkhub] => couldnt connect to host
                                            [stoptomcat]=> Success
                                        )

                                )

                        )

                )

        )

)

目前使用array_merge()无法实现该效果,请求帮忙解决。


解决方案

array_merge()仅会合并顶层数组的键,遇到相同键名时会直接覆盖前者,无法处理深层嵌套数组的合并需求。针对你的场景,可通过以下两种方式实现目标:

方法1:通用递归合并函数

该函数支持任意深度的数组合并,遇到相同键的数组时会递归合并而非覆盖,通用性更强:

function recursiveArrayMerge($arr1, $arr2) {
    foreach ($arr2 as $key => $value) {
        if (isset($arr1[$key]) && is_array($arr1[$key]) && is_array($value)) {
            $arr1[$key] = recursiveArrayMerge($arr1[$key], $value);
        } else {
            // 非数组字段若值相同,覆盖不影响;若需保留原数值可调整逻辑
            $arr1[$key] = $value;
        }
    }
    return $arr1;
}

// 执行合并
$mergedarray = recursiveArrayMerge($arr1, $arr2);

方法2:针对当前结构的定向合并

如果数组结构固定,可直接定位到需要合并的深层节点,效率更高:

// 合并tomcat_statuses字段
$mergedStatuses = array_merge(
    $arr1['PatchDeployment'][0]['tomcats'][0]['tomcat_statuses'],
    $arr2['PatchDeployment'][0]['tomcats'][0]['tomcat_statuses']
);

// 构建最终合并数组
$mergedarray = [
    'PatchDeployment' => [
        [
            'ehubid' => $arr1['PatchDeployment'][0]['ehubid'],
            'tomcats' => [
                [
                    'tomcatname' => $arr1['PatchDeployment'][0]['tomcats'][0]['tomcatname'],
                    'servername' => $arr1['PatchDeployment'][0]['tomcats'][0]['servername'],
                    'serverip' => $arr1['PatchDeployment'][0]['tomcats'][0]['serverip'],
                    'tomcat_statuses' => $mergedStatuses
                ]
            ]
        ]
    ]
];

两种方法均可得到你期望的合并结果,可根据实际场景选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:47:12