【问题标题】:Differences between array_replace and array_merge in PHPPHP中array_replace和array_merge的区别
【发布时间】:2015-12-19 05:14:43
【问题描述】:

我正在尝试找出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 试试什么?如果您看到提到的问题和答案,则该解决方案适用于这两种功能。但我只是想知道,是否还有其他情况,这两个函数不会为关联数组提供相同的结果。

标签: php arrays


【解决方案1】:

对于带有字符串键的数组,是的,正如您所提到的,这些是等价的。如果您有数字键,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 你是什么意思?它如何影响内容(不仅仅是键)?
  • @TareqMahmood 我的意思是这个。给定 $a = { 0 => 'hello' } 和 $b = { 0 => 'goodbye' } 然后 array_merge($a,$b) = { 0 => 'hello', 1 => 'goodbye' } 而array_replace($a,$b) = { 0 => '再见' }。当键是数字且不关联时,replace 会逐字替换。对于关联键或在两个输入数组中都没有找到的键,这两个函数的行为相同。
  • 另外,根据手册,array_replace 可能会在出错时返回 NULL。 (我想知道在array_replace中会出现什么样的错误,但在array_merge中不会出现。)
【解决方案2】:

Jarek 在他的文章中给出了很好的解释:

https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

他还添加了将 + 运算符与数组一起使用以进行比较。

【讨论】:

  • 尽量不要只使用链接作为答案。最好从链接来源复制有价值的信息,以防链接停止工作
猜你喜欢
  • 2013-04-21
  • 2016-06-06
  • 2016-06-26
  • 2011-07-20
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2015-09-21
相关资源
最近更新 更多