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
相关产品推荐
相关产品推荐

