【问题标题】:PHP - How to properly merge 2 arrays multi level in this example?PHP - 如何在此示例中正确合并 2 个数组多级?
【发布时间】:2016-09-04 12:24:16
【问题描述】:

我有以下数组:

$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 有没有办法做到这一点?只使用合并?我究竟做错了什么?

【问题讨论】:

  • 合并前你得到了正确的数组,但是合并后你删除了 3 个值?

标签: php arrays merge array-merge


【解决方案1】:

这应该可以解决问题:

array_replace_recursive($arrIni,$setParam);

【讨论】:

  • 这个功能很好用。我们能理解array_replace_recursive()可以完全替代array_merge_recursive()array_merge()吗?
  • 我不这么认为。这取决于你需要解决什么样的问题。在你的情况下,array_replace_recursive 是要走的路,但有时你需要覆盖键,所以你使用 array_merge。
【解决方案2】:

如果你想合并一个给定的值,使用这个:

$arrIni["arrEnvSettings"]["pages"]["st3"] = $setParam["arrEnvSettings"]["pages"]["st3"];

但是您这样做的方式是合并两个数组,而不是简单地在数组中设置值。这两种方法有很大的不同。

否则,是的,您需要迭代地合并数组。

【讨论】:

    【解决方案3】:

    你需要的是array_replace_recursive

    print_r(array_replace_recursive($arrIni,$setParam));
    

    没有看到提交的答案..Felippe Duarte 已经给出了答案......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2019-06-05
      • 2011-04-15
      相关资源
      最近更新 更多