Сложение массивов в 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"];
Но на этом её применение не заканчивается, конечно.
19 ноября 2015 08:37

Svan (инкогнито)
19 ноября 2015, 09:29

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

bolknote.ru (bolknote.ru)
19 ноября 2015, 09:34, ответ предназначен Svan

Всё верно, в последнюю минуту заменил цифры на L и R и опечатался.

smikera (инкогнито)
19 ноября 2015, 17:57

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

bolknote.ru (bolknote.ru)
19 ноября 2015, 20:17, ответ предназначен smikera

Да, хорошее замечание, я этот случай не рассмотрел.

smikera (инкогнито)
19 ноября 2015, 22:11

Еще немного некорректно написано про перезаписывание значений со строковыми ключами. Если в строке число, срабатывает как целочисленное:
var_dump(array_merge(['1'=>1],['2'=>2, '1'=>3]));

smikera (инкогнито)
19 ноября 2015, 22:16

А нет, вру, это на уровне объявления массива ключи в целочисленные переводятся.

Сергей (инкогнито)
20 ноября 2015, 09:59, ответ предназначен bolknote.ru:

А с какого возраста в вашем окружении перестают в подобных ситуациях употреблять "ребята"? Разве так говорят мужики?

bolknote.ru (bolknote.ru)
20 ноября 2015, 10:02, ответ предназначен Сергею

А это возраст определяет? Что такое «моё окружение»? Я, по-вашему, мужик?

hshhhhh.name (инкогнито)
13 декабря 2015, 05:12

группы ключей строковых
#390423
Владимир: у кого есть копия пиратская Пиратов моря Карибского?
buts: пипец! Маяковский в чате!

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)