Dubrowsky
Хроники одного дупла
Блогово  →  WebDev  → 

Конкатенация (объединение) массивов в PHP

24 Апреля 2013 года

К стыду своему признаю, что за такими простыми вещами, несмотря на кучу лет практики, мне до сих пор приходится ходить в доку. Пожалуй запишу, как объединять массивы в 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% :)

А вот табличка, демонстрирующая три описанных выше метода:

Вот так. Если, прочитав это, вы решили срочно сварить немного коррозионностойкой стали, или например кусок углеродистой стали с титаном, ваш выбор - это аргонодуговая сварка электродом, ничего лучше не найдете, поскольку вольфрамовый электрод - это сила! 

Камменты

programmingmaster28.07.2013, 11:24#
Статьи по php можно найти
алекс20.07.2014, 17:42#
Спасибо! Не знал, что array_merge ассоциативные массивы с одинаковыми ключами затирает. 2 часа голову ломал. Вышел из положения помещением каждого соединяемого массива в отдельный array()
Серж25.01.2017, 05:59#
$array1 = ['link1' => 6, 'link2' => 4];
$array2 = ['link2' => 6, 'link3' => 6];

Как сделать, чтобы в итоге вышел массив:
['link1' => 6,'link2' => 10, 'link3' => 6] ?
Дубр09.02.2017, 03:18#
Серж, из коробки кажется никак. А так - ну берем и пишем 10 строчек кода. типа такого.
Дмитрий31.01.2019, 11:35#
array_merge_recursive. http://php.net/manual/ru/function.array-merge-recursive.php

Написать коммент: памятка постеру

 

Крутые посты wtf??? →

27.06.2012 · 37 камментов · рейтинг 10.02
23.01.2013 · 21 каммент · рейтинг 7.87
29.08.2007 · 28 камментов · рейтинг 6.76
28.03.2008 · 24 каммента · рейтинг 6.42
30.01.2013 · 13 камментов · рейтинг 6.2

Последне камменты

12.10.2019  6THFV6ZDSU0J 6THFV6ZDSU0J 6THFV6ZDSU0J www.yandex.ruДинамическая отправка формы с файлом в IE (ajax file upload + form.submit): S5yizZQjiS9
26.09.2019  5ZQMBL3RXY98 5ZQMBL3RXY98 5ZQMBL3RXY98 www.yandex.ruтам же: xwWbT1nO
26.09.2019  AT8LJX8SMJPE AT8LJX8SMJPE AT8LJX8SMJPE www.yandex.ruПочему не работает form.submit(): OuQnxIU8HYE
24.09.2019  2SSUSLMI 2SSUSLMI 2SSUSLMI www.yandex.ruтам же: 1DaGyZzh5
04.05.2019  Brian Fargoтам же: Спасибо. Все на поверхности, но фиг вкуришь с лету...

Статсы