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 камментов · рейтинг 8.19
06.03.2008 · 29 камментов · рейтинг 6.14
29.08.2007 · 28 камментов · рейтинг 5.93
19.01.2008 · 20 камментов · рейтинг 5.08
30.01.2013 · 13 камментов · рейтинг 4.99

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

Статсы