array_merge和array + array有什么区别?

The*_*per 106 php arrays merge addition

一个相当简单的问题.有什么区别:

$merged = array_merge($array1, $array2);
Run Code Online (Sandbox Code Playgroud)

$merged = $array1 + $array2;
Run Code Online (Sandbox Code Playgroud)

Yeh*_*sef 83

这是一个简单的说明性测试:

$ar1 = [
   0  => '1-0',
  'a' => '1-a',
  'b' => '1-b'
];


$ar2 = [
   0  => '2-0',
   1  => '2-1',
  'b' => '2-b',
  'c' => '2-c'
];

print_r($ar1+$ar2);

print_r(array_merge($ar1,$ar2));
Run Code Online (Sandbox Code Playgroud)

结果:

Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 1-b
  [1] => 2-1
  [c] => 2-c
)
Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 2-b
  [1] => 2-0
  [2] => 2-1
  [c] => 2-c
)
Run Code Online (Sandbox Code Playgroud)

请注意,重复的非数字键将使用union运算符获取第一个值,而后者使用array_merge.

对于数字键,第一个值将与union运算符一起使用,而所有值将与array_merge一起使用,只需重新编制索引.

我通常使用union运算符表示关联数组,使用array_merge表示数字.当然,你也可以使用array_merge进行关联,只是后面的值会覆盖之前的值.


Mik*_*wis 65

不同之处是:

+运算符采用两个阵列的结合,而array_merge函数采用联合BUT的重复键被覆盖).

  • 对于这里的初学者来说,两种情况下的操作结果都是**null**,如果任何一个数组都是**null**.有些人可能不关心这个假设,因为它是一个联合操作,如果其中一个是**null,结果将是正确的(非空)数组.但是,如果其中一个数组是一个空数组,那就是正确的.因此,作为一种好的做法,我认为,我们应该将输入数组初始化为空数组.你们说什么? (15认同)
  • 如果有重复的键,"采取联合"将始终_have_去除其中一个.不同之处在于哪一个. (6认同)
  • 对不起,这个答案令人困惑,错误和不完整.:-o请参阅@ alexis关于混淆位的评论(虽然他也只是关于OP的一半事实).2.参见[Yehosef的回答](/sf/answers/1675162401/)关于`array_merge`**实际*做什么...... 3.并看[BoltClock的回答](/sf/answers/377594871/)关于这里没有提到的另一个重要区别:`array_merge`重置数字键,与`+`不同. (5认同)
  • 一点也不具体。没有帮助。并没有突出差异。解释水平太高了。 (2认同)

Bol*_*ock 49

array_merge()导致在输入数组中找到的所有数字键在结果数组中重新编制索引.union运算符+不会导致重新索引.


Tsc*_*cka 20

+符号仅获取数组键第一次出现时的值.
array_merge获取最后一次出现的数组键的值.

例:

$first = ['a'=>'one',
        'b'=>'two',
        'c'=>'three'];

$second = ['a'=>'fourth',
        'b'=>'fifth',
        'c'=>'sixth',
        '3'=>'number three'];

$merged = $first + $second;
echo "<pre> plus sign merge\n";
var_dump($merged);

$merged = array_merge($first,$second);
echo "\n array_merge function merge\n";
var_dump($merged);
Run Code Online (Sandbox Code Playgroud)

这输出:

加号合并
数组(4){
["a"] =>
string(3)"one"
["b"] =>
string(3)"two"
["c"] =>
string(5)"three"
[3] =>
字符串(12)"三号"
}

array_merge function merge
array(4){
["a"] =>
string(6)"fourth"
["b"] =>
string(5)"fifth"
["c"] =>
string(5)"six"
[0] =>
字符串(12)"三号"
}

值得注意的是,即使它是一个字符串,它array_merge实际上也会删除三号的'3'索引,因为它是一个数字.

因此在与array_merge具有数字索引的数组合并时要小心.他们可能会丢失钥匙.如果它们对你很重要,则在它们之前加上一个字符串.

所以不要'3' => 'three'使用类似的东西'_3' => 'three'

  • "*即使它是一个字符串,因为它是一个数字*"值得+1 :-) (5认同)

luc*_*nov 15

array_merge vs加

资料来源:https : //softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

停止使用array_merge($ defaults,$ options):

function foo(array $options)
{
   $options += ['foo' => 'bar'];

   // ...
}
Run Code Online (Sandbox Code Playgroud)

注意:array_replace函数从PHP5.3开始存在。

  • 为什么我们应该停止使用 array_merge($default, $options):?因为它不允许非索引键? (2认同)

kle*_*tte 5

我相信会array_merge覆盖重复的非数字键,而$array1 + $array2不会.