Сложение массивов в PHP

Некоторые ребята не знают, что в ПХП есть операция «плюс» над массивами, а открыв её для себя случайным чтением инструкции по языку, не знают чем она отличается от array_merge. Между тем отличия разительные, если их не знать, легко наплодить ошибок в коде.

Операция сложения («плюс») с массивами работает проще всего: если в левом массиве уже есть значение с таким ключом, оно и остаётся:

["L"] + ["R"]; // будет ["L"]
["a" => "L"] + ["a" => "R", "b" => "R"]; // будет ["a" => "L", "b" => "R"]

Операция слияния массивов (array_merge) работает по-разному в зависимости от типа ключей массива. Значения со строковыми ключам правого массива перезаписывают значения левого с тем же ключём, а значения с целыми добавляются в конец левого.

array_merge(["L"], ["R", 4 => "R"]); // ["L", "R", "R"], значения целых ключей правого массива потерялись, сам массив добавился в конец
array_merge(["a" => "L"], ["a" => "R"]); // ["a" => "R"], совпадение строковых ключей
array_merge(["L", "a" => "L"], ["R", "a" => "R", 4 => "R"]); // ["L", "a" => "R", "R", "R"], разные типы ключей вместе

Операция «плюс» очень полезна для добавления группы ключей строковых со значениями (для объединения ассоциативных массивов):

$arr = ["key1" => "value1", "key2" => "value2"];

// вместо
$arr["key3"] = "value3";
$arr["key4"] = "value4";

// проще написать так:
$arr += ["key3" => "value3", "key4" => "value4"];

Но на этом её применение не заканчивается, конечно.

Комментарии 9

Svan № 1
> ["a" => «L»] + ["a" => «R», «b» => «R»]; // будет ["a" => «R», «b» => «R»]

Разве будет не: «["a" => „L“, „b“ => „R“]»?

Евгений Степанищев (bolknote.ru) автор № 2
Всё верно, в последнюю минуту заменил цифры на L и R и опечатался.
smikera № 3
значения целых ключей правого массива потерялись, сам массив добавился в конец

Надо отметить, что в общем случае теряются ключи всех массивов, т.к. идет перенумерация с 0. В этом частном случае теряются только правого, да.

smikera № 5

Еще немного некорректно написано про перезаписывание значений со строковыми ключами. Если в строке число, срабатывает как целочисленное:

var_dump(array_merge(['1'=>1],['2'=>2, '1'=>3]));
Сергей № 7
Комментарий для Евгения Степанищева:

А с какого возраста в вашем окружении перестают в подобных ситуациях употреблять «ребята»? Разве так говорят мужики?
Евгений Степанищев (bolknote.ru) автор № 8
А это возраст определяет? Что такое «моё окружение»? Я, по-вашему, мужик?
hshhhhh.name № 9
группы ключей строковых
#390423
Владимир: у кого есть копия пиратская Пиратов моря Карибского?
buts: пипец! Маяковский в чате!