【问题标题】:PHP array_merge key orderPHP array_merge 键顺序
【发布时间】:2012-07-23 10:01:40
【问题描述】:

数组数组中的键执行array_merge的顺序是否重要,即下面第二个数组中的键是否会覆盖第一个数组中的键:

array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active');
array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd');

?还是两个数组中键的顺序必须相同?

【问题讨论】:

  • 你可以通过简单的尝试为自己节省 5 分钟

标签: php arrays array-merge


【解决方案1】:

manual 说明了这个问题的答案:

将一个或多个数组的元素合并在一起,以便将一个数组的值附加到前一个数组的末尾。它返回 结果数组。

如果输入数组有相同的字符串键,那么后面的值 因为该键将覆盖前一个键。 但是,如果数组 包含数字键,后面的值不会覆盖原来的 值,但会被附加。

所以,是的,如果第二个数组包含一些相同的键,那么第二个数组中的键将覆盖第一个数组中的键。

$array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active');
$array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd');

$new = array_merge($array1, $array2);

print_r($new);

输出:

Array
(
    [username] => bcd
    [level] => root
    [status] => active
)

所以你可以看到第二个数组中的键覆盖了第一个中的相同键;每个数组中键的顺序无关紧要。

【讨论】:

    【解决方案2】:

    这是一个替代解决方案,它允许使用模板数组来定义输出顺序。缺少的字段用null 填充或按指定填充。在此示例中,firstlast 字段用 --- 填充。

    请注意上一个关于数字键的答案中突出显示的文本。

    function array_merge_template($array1, $array2, $template, $fill=null) {
        $_template = array_fill_keys($template, $fill);
        return array_intersect_key ( array_replace ( $_template, array_merge($array1, $array2)) , $_template);
    }
    

    输入:

    $array1 = ['username' =>'abc', 'level' =>'admin', 'status' =>'active', 'foo'=>'x'];
    $array2 = ['level' =>'root', 'status' =>'active', 'username' =>'bcd', 'bar'=>'y'];
    $template = ['first','level','foo','username','bar','status','last'];
    

    输出:

    /* array_merge($array1,$array2) */
    [
        "username" =>  "bcd",
        "level"    =>  "root",
        "status"   =>  "active",
        "foo"      =>  "x",
        "bar"      =>  "y"
    ]
    
    /* array_merge_template($array1,$array2,$template,'---') */
    [
        "first"    =>  "---",
        "level"    =>  "root",
        "foo"      =>  "x",
        "username" =>  "bcd",
        "bar"      =>  "y",
        "status"   =>  "active",
        "last"     =>  "---"
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2016-06-06
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多