К стыду своему признаю, что за такими простыми вещами, несмотря на кучу лет практики, мне до сих пор приходится ходить в доку. Пожалуй запишу, как объединять массивы в PHP - вроде бы у меня "письменная память", глядишь и запомню :)
Тем более, что в PHP в этом месте есть не очевидные аспекты поведения.
Итак, PHP предлагает для объединения массивов два инструмента: php-функция array_merge и оператор "+" ("Union").
Функция array_merge()
array_merge() принимает аргументами массивы, которые нужно объединить. Магия состоит в том, как обрабатываются ключи:
- для записей с числовым ключом значение правого массива добавляется в конец левого;
- для записей со строковым ключом значение правого массива перезаписывает значение левого с аналогичным ключом, если оно есть, если нет - добавляется.
Соответственно, array_merge() можно использовать для конкатенации индексных (indexed) массивов и слияния ассоциативных (associative).
Если в сливаемых массивах есть ключи разных типов, результат оказывается зачастую непредсказуемым.
Оператор сложения массивов (Union): $arr1 + $arr2
Поведение описано вот тут. Принцип такой:
- если в левом массиве есть тот же ключ, что и в правом, будет использовано значение из левого;
- иначе будет добавлено значение из правого с сохранением ключа.
То есть идея оператора в том, чтобы добавить в левый массив новые значения из правого. Редко когда бывает нужно, но лучше помнить про такую возможность.
Конкатенация (объединение) массивов
Как видим, ни один из этих инструментов не позволяет выполнить конкатенацию массивов. В статье вики по предыдущей ссылке есть требование:
Длина конкатенации слов равна сумме длин операндов
Из-за объединения по ключам и array_merge(), и union могут вернуть результат произвольной длины.
Я нафигачил вот такой нехитрый метод, тупо добавляющий каждый правый массив в конец результата без сохранения ключей:
function array_concat() {
$args = func_get_args();
foreach ($args as $ak => $av) {
$args[$ak] = array_values($av);
}
return call_user_func_array('array_merge', $args);
}
Можно пользоваться по необходимости. Но вообще лучше избегать массивов со смешанными ключами, инфа 100% :)
А вот табличка, демонстрирующая три описанных выше метода:
Вот так. Если, прочитав это, вы решили срочно сварить немного коррозионностойкой стали, или например кусок углеродистой стали с титаном, ваш выбор - это аргонодуговая сварка электродом, ничего лучше не найдете, поскольку вольфрамовый электрод - это сила!