Операторы сложения: почему такое странное поведение?

Стоит задача соединить два нумерованных массива таким образом, чтобы элементы второго массива заменили элементы в первом. Ясное дело, здесь нужно сложение без переиндексации, то есть используем обычный оператор сложения:

$arr1 = ['x', 'y', 'z', 'o'];
$arr2 = ['a', 'b', 'c'];

$arr1 = $arr1 + $arr2;

print_r($arr1);


Здесь всё очевидно - к первому добавляется второе, на первый массив "накладывается" второй, и мы получим [a, b, c, o]. Но внезапно:
Array ( [0] => x [1] => y [2] => z [3] => o )

То есть получилось с точностью до наоборот - первый массив наложился на второй!
Ладно, хорошо, допустим, так у нас работает оператор сложения, первый операнд добавляется ко второму...
В таком случае более логично должен работать оператор увеличения, то есть прибавления:

$arr1 = ['x', 'y', 'z', 'o'];
$arr2 = ['a', 'b', 'c'];

$arr1 += $arr2;

print_r($arr1);


То есть тут прямо написано "увеличь первую переменную на то, что записано во второй".
Но опять фейл:

Array ( [0] => x [1] => y [2] => z [3] => o )

Что за ерунда, товарищи? Это везде так сложение работает, или это специфика PHP? Код же нечитабельный получается, если я напишу:

$arr1 = $arr2 + $arr1;

- я получу конечно то что хотел изначально, но в коде это будет читаться как наложение первого на второе... Да и тут явно написано лишний раз $arr1, а оператор += я не могу использовать, так как он работает наоборот..

Есть какой-то оператор или функция, чтобы массивы были по-человечески расположены?
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
Audiophile
@Audiophile Автор вопроса
Как оказалось, никакой логики нет, просто так захотелось разработчикам - чтобы значение бралось из левого массива, а не из правого. Для моей задачи более-менее подошло

$arr1 = array_replace($arr1, $arr2);

Хотя сократить запись как в случае с += нельзя...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Оператор сложения работает не со значениями, а с ключами.
The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.
www.php.net/manual/en/language.operators.array.php

Вам нужна функция array_merge.
Похоже, единственное решение вашей задачи - циклом проходить по второму массиву и перезаписывать первый по ключу.
Ответ написан
romy4
@romy4
Exception handler
вы изучите раздел функций работы с массивом. array_merge
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы