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 已经给出了.....