执行array_merge的数组数组中的键的顺序是否重要,即下面第二个数组中的键是否会覆盖第一个数组中的键:
array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active');
array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd');
? 还是两个数组中键的顺序必须相同?
执行array_merge的数组数组中的键的顺序是否重要,即下面第二个数组中的键是否会覆盖第一个数组中的键:
array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active');
array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd');
? 还是两个数组中键的顺序必须相同?
手册说明了这个问题的答案:
将一个或多个数组的元素合并在一起,以便将一个数组的值附加到前一个数组的末尾。它返回结果数组。
如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。
所以,是的,如果第二个数组包含一些相同的键,第二个数组中的键将覆盖第一个数组中的键。
$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
)
所以你可以看到第二个数组中的键覆盖了第一个数组中的相同键;每个数组中键的顺序无关紧要。
这是一个替代解决方案,它允许使用模板数组来定义输出顺序。缺少的字段用null
或按指定填充。在此示例中,first
和last
字段用 填充---
。
请注意上一个关于数字键的答案中突出显示的文本。
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" => "---"
]