Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Сложение массивов в 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 2015

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

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

Евгений Степанищев (bolknote.ru) 2015

Комментарий для Svan:

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

smikera 2015

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

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

Евгений Степанищев (bolknote.ru) 2015

Комментарий для smikera:

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

smikera 2015

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

var_dump(array_merge([’1’=>1],[’2’=>2, ’1’=>3]));

smikera 2015

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

Сергей 2015

Комментарий для Евгения Степанищева:

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

Евгений Степанищев (bolknote.ru) 2015

Комментарий для Сергей:

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

hshhhhh.name 2015

группы ключей строковых

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