PHP中array_replace和array_merge的区别

23
我正在努力弄清array_replace()array_merge()之间的区别。这个问题实际上是在阅读了这篇文章PHP array_merge empty values always less prioritar后产生的,其中任何一个函数都可以解决这个问题。因此,我试图找出应该在什么情况下使用array_replace而不是array_merge,反之亦然。
阅读了两个函数的php文档后,我发现以下两点不同:
1.如果数组包含数字键,则array_merge()中的后续值不会覆盖原始值,而在array_replace()中将会覆盖原始值。 2.在array_merge()中,具有数字键的输入数组中的值将在结果数组中以从零开始的递增键重新编号,而这不应该在array_replace()中发生。
由于差异仅涉及数字键,我们可以安全地说,在处理关联数组时,函数array_replace()array_merge()是完全等效的吗?或者我忽略了其他的差异吗?

@zpr 试什么?如果您查看了相关的问题和答案,该解决方案适用于这两个函数。但我只是想知道,在关联数组中是否存在其他情况,这两个函数不会产生相同的结果。 - Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
2个回答

29

4
尽量不要只使用链接作为回答。将有价值的信息从链接源复制到回答中以备链接失效时可用,是一个很好的实践方法。 - zajonc

20

对于具有字符串键的数组,正如您所提到的,它们是等效的。如果您有数字键,array_merge()将根据需要追加它们,甚至在必要时重新排序它们,而array_replace()将覆盖原始值。

例如,

$a = array('a' => 'hello', 'b' => 'world');
$b = array('a' => 'person', 'b' => 'thing', 'c'=>'other', '15'=>'x');

print_r(array_merge($a, $b));
/*Array
(
    [a] => person
    [b] => thing
    [c] => other
    [0] => x
)*/

print_r(array_replace($a, $b));
/*Array
(
    [a] => person
    [b] => thing
    [c] => other
    [15] => x
)*/

正如您所看到的,array_merge已经重新索引了数组中的数字键,并且两个简单地更新了字符串键。

然而,当您有数字键时,array_merge()将不会关心键,并按照它看到的顺序添加所有内容,不删除任何内容,而array_replace()将根据相似的(数字)索引替换键,正如其名称所示:

<?php
$a = array('0'=>'a', '1'=>'c');
$b = array('0'=>'b');

print_r(array_merge($a, $b));
/*Array
(
  [0] => a
  [1] => c
  [2] => b
)*/

print_r(array_replace($a, $b));
/*Array
(
  [0] => b
  [1] => c
)*/

需要注意的是,如果数组共享数字键,则存在显着差异。合并操作将保留原始内容,而替换操作则是破坏性的。 - tbernard
@tbernard 你是什么意思?它对内容有什么影响(不仅仅是键)? - Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
1
@TareqMahmood 我的意思是这样的。假设 $a = { 0 => 'hello' } 和 $b = { 0 => 'goodbye' },则 array_merge($a,$b) = { 0 => 'hello', 1 => 'goodbye' } 而 array_replace($a,$b) = { 0 => 'goodbye' }。当键是数字且不是关联的时,replace 就像字面意思一样进行替换。这两个函数仅在关联的键或两个输入数组中都不存在的键上表现相同。 - tbernard
另外,根据手册,array_replace 在出错时可能返回 NULL。(我想知道在 array_replace 中会发生什么样的错误,而在 array_merge 中却不会。) - user1768761

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