PHP 中array_replace和array_merge之间的差异

2022-08-30 20:56:02

我试图弄清楚array_replace()array_merge()之间的区别。在这篇文章之后,我实际上想到了这个问题:PHP array_merge空值总是不那么先验,实际上可以通过这两个函数中的任何一个来解决问题。因此,我试图找出在哪些情况下我们应该使用array_replace而不是array_merge反之亦然。

在阅读了这两个函数的php文档之后,我发现了这两个区别:

  1. 如果数组包含数字键,则后面的值不会覆盖 中的原始值,这将在 中完成。array_merge()array_replace()
  2. 在 中,具有数字键的输入数组中的值将使用结果数组中从零开始的递增键重新编号,这在 .array_merge()array_replace()

由于这些差异仅与数字键有关,因此当我们处理关联数组时,我们是否可以放心地说,函数和是完全等价的?还是我错过了任何其他区别?array_replace()array_merge()


答案 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
)*/

答案 2

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

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

他还添加了使用带有数组的 + 运算符进行比较。

Graphic showing the difference