В чем разница между array_merge и array + array? - PullRequest
100 голосов
/ 22 марта 2011

Довольно простой вопрос.В чем разница между:

$merged = array_merge($array1, $array2);

и

$merged = $array1 + $array2;

?

Ответы [ 9 ]

77 голосов
/ 29 мая 2014

Вот простой иллюстративный тест:

$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));

с результатом:

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
)

Обратите внимание, что дублирующиеся нечисловые ключи примут первое значение с помощью оператора объединения, но позжеодин с использованием array_merge.

Для числовых ключей первое значение будет использоваться с оператором объединения, тогда как все значения будут использоваться с array_merge, просто переиндексируется.

Обычно я использую оператор объединения для ассоциативных массивов иarray_merge для числового значения.Конечно, вы можете также использовать array_merge для ассоциативного, просто чтобы более поздние значения перезаписывали более ранние.

62 голосов
/ 22 марта 2011

Разница:

Оператор + принимает объединение двух массивов, тогда как функция array_merge принимает объединение НО , дублирующиеся ключи перезаписываются).

48 голосов
/ 22 марта 2011

array_merge() вызывает переиндексирование всех числовых ключей, найденных во входных массивах, в результирующем массиве.Оператор объединения + не вызывает переиндексацию.

18 голосов
/ 15 февраля 2016

Знак + принимает значение только из первого вхождения ключа массива.
array_merge принимает значение из last вхождения ключа массива.

Пример:

$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);

Это выводит:

объединение со знаком плюс
массив (4) {
[ "А"] =>
строка (3) «один»
[ "Ь"] =>
строка (3) "два"
[ "С"] =>
строка (5) "три"
[3] =>
строка (12) "номер три"
}

функция массива_мердж слияния
массив (4) {
[ "А"] =>
строка (6) "четвертый"
[ "Ь"] =>
строка (5) "пятый"
[ "С"] =>
строка (5) «шестой»
[0] =>
строка (12) "номер три"
}

Интересно отметить, что array_merge фактически стирает индекс '3' числа три, даже если это строка, потому что это число.

Так что будьте осторожны при объединении с array_merge массивами с числовыми индексами. Они могут потерять свои ключи. если они важны для вас, поставьте перед ними строку.

поэтому вместо '3' => 'three' используйте что-то вроде '_3' => 'three'

11 голосов
/ 29 октября 2018

array_merge vs plus

Источник: https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Прекратить использование array_merge ($ defaults, $ options):

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

   // ...
}

Примечание : функция array_replace существует начиная с PHP5.3.

5 голосов
/ 22 марта 2011

Я полагаю, array_merge перезаписывает дубликаты не числовых ключей, а $array1 + $array2 - нет.

3 голосов
/ 25 августа 2017

Еще один пример (массивы без явных ключей; очевидно, как работают операторы + и array_merge, но «очевидные» вещи проще, если их видеть;))

$a = array('apple');
$b = array('orange', 'lemon');

echo '$a + $b = ';             print_r($a + $b);
echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b));

дать:

$a + $b = Array
(
    [0] => apple
    [1] => lemon
)
array_merge($a, $b) = Array
(
    [0] => apple
    [1] => orange
    [2] => lemon
)
0 голосов
/ 28 февраля 2018

Так что, очевидно, если вы измените порядок, объединение и объединение будут делать то же самое

$a = array('foo' => 'bar', 'x' => 'fromA');
$b = array('foo' => null, 'x' => 'fromB');

echo '$a+$b: ';
var_dump($a+$b);

echo '$b+$a: ';
var_dump($b+$a);

echo 'array_merge($a, $b): ';
var_dump(array_merge($a, $b));

echo 'array_merge($b, $a): ';
var_dump(array_merge($b, $a));

Выходы:

$a+$b: array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}
$b+$a: array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($a, $b): array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($b, $a): array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}

Учитывайте порядок массивов.

0 голосов
/ 15 февраля 2017

Обратите внимание на другое различие: объединение (+) не будет перезаписывать непустое значение пустым значением (учитывая тот же ключ), тогда как array_merge будет:

$a = array('foo' => 'bar');
$b = array('foo' => ''); // or false or 0

print_r($a+$b);
print_r(array_merge($a, $b);

Выходы:

Array
(
    [foo] => bar
)
Array
(
    [foo] => 0
)
...