PHP - 如何在这个例子中正确合并 2 个数组?
PHP - How to properly merge 2 arrays multi level in this example?
我有以下数组:
$arrIni["ENV"]="US";
$arrIni["sap_db_server"] = "192.xxx.x.xx";
$arrIni["local_db_server"] = "localhost";
$arrIni["local_db_username"] = "root";
//Default settings
$arrIni["arrEnvSettings"]["UserTypeID"]=4;
$arrIni["arrEnvSettings"]["LocalizationID"]=1;
$arrIni["arrEnvSettings"]["LangLabels"] = array();
$arrIni["arrEnvSettings"]["pages"]["st1"]="st1.php";
$arrIni["arrEnvSettings"]["pages"]["st2"]="st2.php";
$arrIni["arrEnvSettings"]["pages"]["st3"]="st3.php";
我想和这个合并:
$setParam["arrEnvSettings"]["pages"]["st3"]="st3_V2.php";
这就是我正在做的事情:
echo "<pre>";
print_r(array_merge($arrIni,$setParam));
echo "</pre>";
这就是我得到的:
Array
(
[ENV] => US
[sap_db_server] => 192.xxx.x.xx
[local_db_server] => localhost
[local_db_username] => root
[arrEnvSettings] => Array
(
[pages] => Array
(
[st3] => st3_V2.php
)
)
)
在php doc about merge,这是评论" ...If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. ..."
所以通过这种方式,我想得到这个输出而不是最后一个:
Array
(
[ENV] => US
[sap_db_server] => 192.xxx.x.xx
[local_db_server] => localhost
[local_db_username] => root
[arrEnvSettings] => Array
(
[UserTypeID] => 4
[LocalizationID] => 1
[LangLabels] => Array
(
)
[pages] => Array
(
[st1] => st1.php
[st2] => st2.php
[st3] => st3_V2.php
)
)
)
我不明白为什么 $setParam["arrEnvSettings"]["pages"]["st3"]
会覆盖整个 $arrIni["arrEnvSettings"]
。
注:
如果我使用 array_merge_recursive($arrIni,$setParam))
我会得到以下结果,但这不是我想要的。
Array
(
[ENV] => US
[sap_db_server] => 192.xxx.x.xx
[local_db_server] => localhost
[local_db_username] => root
[arrEnvSettings] => Array
(
[UserTypeID] => 4
[LocalizationID] => 1
[LangLabels] => Array
(
)
[pages] => Array
(
[st1] => st1.php
[st2] => st2.php
[st3] => Array
(
[0] => st3.php
[1] => st3_V2.php
)
)
)
)
有没有不用 iterate over the array 的方法?只使用合并?我究竟做错了什么?
这应该可以解决问题:
array_replace_recursive($arrIni,$setParam);
如果要合并给定值,请使用:
$arrIni["arrEnvSettings"]["pages"]["st3"] = $setParam["arrEnvSettings"]["pages"]["st3"];
但是您这样做的方式是合并两个数组,而不是简单地在一个数组中设置值。这两种方法之间存在巨大差异。
否则,是的,您将需要迭代合并数组。
你需要的是array_replace_recursive
print_r(array_replace_recursive($arrIni,$setParam));
没有看到提交的答案..Felipe Duarte 已经给出了.....
我有以下数组:
$arrIni["ENV"]="US";
$arrIni["sap_db_server"] = "192.xxx.x.xx";
$arrIni["local_db_server"] = "localhost";
$arrIni["local_db_username"] = "root";
//Default settings
$arrIni["arrEnvSettings"]["UserTypeID"]=4;
$arrIni["arrEnvSettings"]["LocalizationID"]=1;
$arrIni["arrEnvSettings"]["LangLabels"] = array();
$arrIni["arrEnvSettings"]["pages"]["st1"]="st1.php";
$arrIni["arrEnvSettings"]["pages"]["st2"]="st2.php";
$arrIni["arrEnvSettings"]["pages"]["st3"]="st3.php";
我想和这个合并:
$setParam["arrEnvSettings"]["pages"]["st3"]="st3_V2.php";
这就是我正在做的事情:
echo "<pre>";
print_r(array_merge($arrIni,$setParam));
echo "</pre>";
这就是我得到的:
Array
(
[ENV] => US
[sap_db_server] => 192.xxx.x.xx
[local_db_server] => localhost
[local_db_username] => root
[arrEnvSettings] => Array
(
[pages] => Array
(
[st3] => st3_V2.php
)
)
)
在php doc about merge,这是评论" ...If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. ..."
所以通过这种方式,我想得到这个输出而不是最后一个:
Array
(
[ENV] => US
[sap_db_server] => 192.xxx.x.xx
[local_db_server] => localhost
[local_db_username] => root
[arrEnvSettings] => Array
(
[UserTypeID] => 4
[LocalizationID] => 1
[LangLabels] => Array
(
)
[pages] => Array
(
[st1] => st1.php
[st2] => st2.php
[st3] => st3_V2.php
)
)
)
我不明白为什么 $setParam["arrEnvSettings"]["pages"]["st3"]
会覆盖整个 $arrIni["arrEnvSettings"]
。
注:
如果我使用 array_merge_recursive($arrIni,$setParam))
我会得到以下结果,但这不是我想要的。
Array
(
[ENV] => US
[sap_db_server] => 192.xxx.x.xx
[local_db_server] => localhost
[local_db_username] => root
[arrEnvSettings] => Array
(
[UserTypeID] => 4
[LocalizationID] => 1
[LangLabels] => Array
(
)
[pages] => Array
(
[st1] => st1.php
[st2] => st2.php
[st3] => Array
(
[0] => st3.php
[1] => st3_V2.php
)
)
)
)
有没有不用 iterate over the array 的方法?只使用合并?我究竟做错了什么?
这应该可以解决问题:
array_replace_recursive($arrIni,$setParam);
如果要合并给定值,请使用:
$arrIni["arrEnvSettings"]["pages"]["st3"] = $setParam["arrEnvSettings"]["pages"]["st3"];
但是您这样做的方式是合并两个数组,而不是简单地在一个数组中设置值。这两种方法之间存在巨大差异。
否则,是的,您将需要迭代合并数组。
你需要的是array_replace_recursive
print_r(array_replace_recursive($arrIni,$setParam));
没有看到提交的答案..Felipe Duarte 已经给出了.....