Вопрос проверяет понимание того, как PHP объединяет массивы, особенно при совпадении ключей и при числовых ключах, что часто приводит к неожиданным багам.
array_merge() объединяет массивы и, если ключи числовые, переиндексирует значения с нуля. При строковых ключах значения из правого массива перезапишут значения из левого. Оператор + работает как “объединение без перезаписи”: он сохраняет значения из левого массива при совпадении ключей. Из-за этого результаты могут сильно отличаться, даже если массивы выглядят похоже.
Обе операции “склеивают” массивы, но делают это по разным правилам. Чтобы не ошибаться, важно разделять случаи: строковые ключи и числовые ключи.
array_merge($a, $b)Определение:array_merge() — функция, которая объединяет массивы и при совпадении строковых ключей берёт значение из последнего массива, а при числовых ключах — переиндексирует элементы заново.
Если ключ строковый и есть в обоих массивах, победит значение из $b.
$a = ['host' => 'localhost', 'port' => 3306];
$b = ['port' => 3307];
$c = array_merge($a, $b);
// ['host' => 'localhost', 'port' => 3307]
Числовые ключи не сохраняются, элементы идут “списком” с ключами 0..n-1.
$a = [10 => 'a', 20 => 'b'];
$b = [30 => 'c'];
$c = array_merge($a, $b);
// [0 => 'a', 1 => 'b', 2 => 'c']
Склеить списки (числовые ключи) в один список
“Наложить” настройки, где правый массив переопределяет левый (строковые ключи)
$a + $bОпределение:
Оператор + для массивов — это объединение по ключам, где сохраняются все элементы из левого массива, а из правого добавляются только те, чьих ключей ещё нет слева.
Ничего не перезаписывается: если ключ уже есть в $a, значение из $b игнорируется.
$a = ['port' => 3306];
$b = ['port' => 3307];
$c = $a + $b;
// ['port' => 3306]
В отличие от array_merge(), числовые ключи не переиндексируются.
$a = [10 => 'a', 20 => 'b'];
$b = [20 => 'x', 30 => 'c'];
$c = $a + $b;
// [10 => 'a', 20 => 'b', 30 => 'c']
Задать значения “по умолчанию” слева, а справа — “добавки”, которые не должны ломать уже заданные ключи
Сохранить числовые ключи (когда они имеют смысл)
Перед выбором инструмента полезно быстро ответить на 2 вопроса:
Нужна перезапись одинаковых ключей?
Да → чаще подходит array_merge()
Нет → чаще подходит $a + $b
Важны ли числовые ключи?
Да → чаще подходит $a + $b
Нет / это список → чаще подходит array_merge()
array_merge() удобно для “наложения” данных и склейки списков, но оно переиндексирует числовые ключи и перезаписывает строковые ключи справа. Оператор + сохраняет левый массив как главный и добавляет только отсутствующие ключи, при этом числовые ключи не ломает. Выбор зависит от того, хотите ли вы перезапись и важны ли числовые ключи.