PHP数组合并键名顺序

4

在执行array_merge时,数组中键的顺序是否重要?换言之,下面第二个数组中的键是否会覆盖第一个数组中的键:

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

那么两个数组中键的顺序必须相同吗?


你本可以通过简单地尝试来节省5分钟的时间。 - John Magnolia
2个回答

5

手册中给出了这个问题的答案:

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

如果输入的数组具有相同的字符串键,则该键的后面值将覆盖前面的值。 但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是将被附加。

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

$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
)

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

1
这里有一种替代方案,可以使用模板数组定义输出顺序。缺少的字段将填充为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"     =>  "---"
]

做得好!我发现这个解决方案对于处理JSON API数据字符串非常有用,因为它们在源头上发生了变化(字段删除或添加),但需要插入到具有先前字段映射的数据库表中。 - Eric P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接