Объединение двух массивов php
array_merge
(PHP 4, PHP 5, PHP 7, PHP 8)
array_merge — Сливает один или большее количество массивов
Описание
Сливает элементы одного или большего количества массивов таким образом, что значения одного массива присоединяются к концу предыдущего. Результатом работы функции является новый массив.
Если входные массивы имеют одинаковые строковые ключи, тогда каждое последующее значение будет заменять предыдущее. Однако, если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено в конец массива.
В результирующем массиве значения исходного массива с числовыми ключами будут перенумерованы в возрастающем порядке, начиная с нуля.
Список параметров
Возвращаемые значения
Возвращает результирующий массив. Если вызывается без аргументов, возвращает пустой массив ( array ).
Список изменений
Версия | Описание |
---|---|
7.4.0 | Функция теперь может быть вызвана без каких-либо параметров. Ранее требовался хотя бы один параметр. |
Примеры
Пример #1 Пример использования array_merge()
Результат выполнения данного примера:
Пример #2 Простой пример использования array_merge()
Помните, что числовые ключи будут перенумерованы!
Если вы хотите дополнить первый массив элементами второго без перезаписи элементов первого массива и без переиндексации, используйте оператор объединения массивов + :
Ключи из первого массива будут сохранены. Если ключ массива существует в обоих массивах, то будет использован элемент из первого массива, а соответствующий элемент из второго массива будет проигнорирован.
Пример #3 Пример использования array_merge() с не массивами
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 2 notes
In some situations, the union operator ( + ) might be more useful to you than array_merge. The array_merge function does not preserve numeric key values. If you need to preserve the numeric keys, then using + will do that.
[ 0 ] = «zero» ;
$array1 [ 1 ] = «one» ;
$array2 [ 1 ] = «one» ;
$array2 [ 2 ] = «two» ;
$array2 [ 3 ] = «three» ;
//This will result in::
?>
Note the implicit «array_unique» that gets applied as well. In some situations where your numeric keys matter, this behaviour could be useful, and better than array_merge.
Website-create.ru
Когда мы работаем с php, то почти всегда имеем дело с массивами. А операция объединения массивов — это то, что приходится проделывать довольно часто.
При этом мы можем хотеть объединять массивы с заменой элементов, у которых встречаются одинаковые ключи
Сегодня мы рассмотрим все эти варианты.
Существует несколько способов объединения массивов в php, но каждый из них может дать разные результаты. Очень важно хорошо осознавать, что и для чего вы делаете. От этого будет зависеть стабильность работы вашей программы.
На протяжении всего поста я буду рассматривать массивы, в каждом из которых 1 элемент имеет идентичный с элементом другого массива строковый ключ. Это важно, потому что при разных способах объединения мы будем получать разные результаты.
Объединение массивов без переиндексации
Чтобы объединить 2 или более массивов можно использовать оператор «+».
При этом, если во втором массиве встретится элемент с ключом, который имеет элемент из первого массива, то элемент второго массива будет проигнорирован (или выброшен). Давайте посмотрим.
А вот, что мы увидим на экране:
Как видно элемент из второго массива с ключом «name» был проигнорирован и не попал в результирующий массив.
Объединение массивов с помощью array_merge
Объединить массивы можно при помощи функции array_merge. В этом случае при совпадении строкового ключа второго массива с ключом первого, будет перезаписано значение элемента первого массива.
Обратите внимание, что это относится только к строковым ключам. В случае числовых ключей (если они идентичны) последнее значение будет добавлено в конец результирующего массива.
Чтобы все это увидеть, я немного модифицирую массивы, добавив им также по элементу с одинаковыми числовыми ключами.
А результат будет вот таким:
Как видите, элемент с ключом «name» добавился из второго массива, а элементы с числовыми индексами переиндексировались и оба оказались в массиве результата.
Объединение двух массивов в один ассоциативный
Сейчас посмотрим, как можно объединить 2 массива так, чтобы значения одного из них стали ключами, а значения второго — значениями.
Здесь нам поможет функция array_combine.
Она принимает 2 параметра:
Количество элементов в массивах должно совпадать, иначе, вместо массива с результатом вы получите false.
Давайте модифицируем наши массивы и посмотрим, как это работает.
Результатом этого кода будет следующий массив:
Как видите, значения первого массива стали ключами, а значения второго — значениями элементов нового массива.
Надеюсь этот пост оказался вам полезным и теперь вы точно знаете все нюансы при объединении массивов в php.
В качестве благодарности ставьте лайки и оставляйте комментарии ))
Также можете подписаться на обновления и всегда быть в курсе новых постов. Здесь никакого спама — только полезное. Форма поиска в сайдбаре справа.
array_combine
array_combine — Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
Описание
Создаёт массив ( array ), используя значения массива keys в качестве ключей и значения массива values в качестве соответствующих значений.
Список параметров
Массив ключей. Некорректные значения для ключей будут преобразованы в строку ( string ).
Возвращаемые значения
Ошибки
Примеры
Пример #1 Простой пример использования array_combine()
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 21 notes
If two keys are the same, the second one prevails.
But if you need to keep all values, you can use the function below:
Further to loreiorg’s script
in order to preserve duplicate keys when combining arrays.
I have modified the script to use a closure instead of create_function
Reason: see security issue flagged up in the documentation concerning create_function
// If they are not of same size, here is solution:
// Output
// Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona
// [AR] => Arkansas )
?>
This will seem obvious to some, but if you need to preserve a duplicate key, being you have unique vars, you can switch the array_combine around, to where the vars are the keys, and this will output correctly.
This [default] formula auto-removes the duplicate keys.
This formula accomplishes the same thing, in the same order, but the duplicate «keys» (which are now vars) are kept.
I know, I’m a newbie, but perhaps someone else will need this eventually. I couldn’t find another solution anywhere.
I was looking for a function that could combine an array to multiple one, for my MySQL GROUP_CONCAT() query, so I made this function.
I needed a function that would take keys from one unequal array and combine them with the values of another. Real life application:
Select 4 product types.
Each product has a serial.
There are 4 sets of products.
Array
(
[0] => Array
(
[SMART Board] => serial to smart board1
[Projector] => serial to projector 1
[Speakers] => serial to speakers 1
[Splitter] => serials to splitter 1
)
[1] => Array
(
[SMART Board] => serials to smart board 2
[Projector] => serials to projector 2
[Speakers] => serials to speakers 2
[Splitter] => serials to splitter 2
)
array_merge_recursive
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
array_merge_recursive — Рекурсивное слияние одного или более массивов
Описание
Функция array_merge_recursive() сливает элементы двух или более массивов таким образом, что значения одного массива присоединяются в конец другого. Возвращает результирующий массив.
Если входные массивы имеют одинаковые строковые ключи, то значения этих ключей сливаются в массив, и это делается рекурсивно, так что если одно из значений является массивом, то функция сливает его с соответствующим значением в другом массиве. Однако, если массивы имеют одинаковые числовые ключи, каждое последующее значение не заменит исходное значение, а будет добавлено в конец массива.
Список параметров
Рекурсивно сливаемые массивы.
Возвращаемые значения
Список изменений
Версия | Описание |
---|---|
7.4.0 | Функция теперь может быть вызвана без каких-либо параметров. Ранее требовался хотя бы один параметр. |
Примеры
Пример #1 Пример использования array_merge_recursive()
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 37 notes
I refactored the Daniel’s function and I got it:
This is a simple, three line approach.
In Addition to felix dot ospald at gmx dot de in my opinion there is no need to compare keys with type-casting, as a key always is changed into an integer if it could be an integer. Just try
$a = array(‘1’=>’1’);
echo gettype(key($a));
It will echo ‘integer’. So for having Integer-Keys simply appended instead of replaced, add the Line:
A Condition I used is:
elseif (is_null($v)) unset($arr[$k]);
And the last one: If you want to use this approach for more than 2 Arrays, simply use this:
I little bit improved daniel’s and gabriel’s contribution to behave more like original array_merge function to append numeric keys instead of overwriting them and added usefull option of specifying which elements to merge as you more often than not need to merge only specific part of array tree, and some parts of array just need to let overwrite previous. By specifying helper element mergeWithParent=true, that section of array will be merged, otherwise latter array part will override former. First level of array behave as classic array_merge.
This is my version of array_merge_recursive without overwriting numeric keys:
function array_merge_recursive_new () <
There are a lot of examples here for recursion that are meant to behave more like array_merge() but they don’t get it quite right or are fairly customised. I think this version is most similar, takes more than 2 arguments and can be renamed in one place:
*Any key only appearing in the right one will be ignored*
— as I didn’t need values appearing only in the right in my implementation, but if you want that you could make some fast fix.
If what you want is merge all values of your array that are arrays themselves to get a resulting array of depth one, then you’re more looking for array_flatten function.
Unfortunately I did not find such native function in php, here is the one I wrote:
Here is a fairly simple function that replaces while recursing.
$array2 = array(
‘liquids’ => array(
‘water’ => ‘hot’
, ‘milk’ => ‘wet’
)
);
Result 2 is:
Array
(
[liquids] => Array
(
[water] => Array
(
[0] => cold
[1] => fizzy
[2] => clean
)
Here’s my function to recursively merge two arrays with overwrites. Nice for merging configurations.
I’ve edit this version even a little bit more, so that the function does not override any values, but inserts them at a free key in the array:
$array1 = array(
100 => array(30),
200 => array(20, 30)
);
$array2 = array(
100 => array(40),
201 => array(60, 30)
);
Output with array_merge_recursive:
Array
(
[0] => Array
(
[0] => 30
)
)
This is not the result, I expect from a MERGE-Routine.
Output with the current function:
This is what I want 🙂
In this version the values are overwritten only if they are not an array. If the value is an array, its elements will be merged/overwritten:
// We walk through each arrays and put value in the results (without
// considering previous value).
$result = array();
An alternative solution where this function does not produce the desired output: Pass a custom recursive function to array_reduce():
For example (Using PHP 7 capabilities to create recursive anonymous function):
Sharing my code to reserve the numeric keys:
$merged = array_merge_recursive($merged, revise_keys($candidate));
>
walfs version is pretty good, but it always assumes we want numeric keys as numeric keys. There are possibilities where a numeric key is actually a string ‘123’
For that I modified the function so that the last argument is a true switch to turn keys can be numeric on. Default is that keys are all string.
Attention.
(used PHP 5.4. XAMPP)
Values with numeric keys are always appended. The index of the merge array is determined by the startindex of the first array. Value4s with numeric keys seems always appended.
If a key looks like an integer, array_merge_recursive will interpret the string as an number.
This recursive array merge function doesn’t renumber integer keys and appends new values to existing ones OR adds a new Объединение двух массивов php pair if the pair doesn’t exist.
Merging arrays recursively some problem about existing keys, so that i wrote the function above like this:
This recursive array merge function doesn’t renumber integer keys and appends new values to existing ones OR adds a new Объединение двух массивов php pair if the pair doesn’t exist.
Proper simplistic example:
Sometimes you need to modify an array with another one here is my approach to replace an array’s content recursively with delete opiton. Here i used «::delete::» as reserved word to delete items.
/**
* Merges any number of arrays of any dimensions, the later overwriting
* previous keys, unless the key is numeric, in whitch case, duplicated
* values will not be added.
*
* The arrays to be merged are passed as arguments to the function.
*
* @access public
* @return array Resulting array, once all have been merged
*/
function array_merge_replace_recursive () <
// Holds all the arrays passed
$params = & func_get_args ();
I’ve tried these array_merge_recursive functions without much success. Maybe it’s just me but they don’t seem to actually go more than one level deep? As with all things, its usually easier to write your own, which I did and it seems to work just the way I wanted. Anyways, my function hasn’t been tested extensively, but it’s a simple function, so in hopes that this might be useful to someone else I’m sharing.
Also, the PHP function array_merge_recursive() didn’t work for my purposes because it didn’t overwrite the values like I needed it to. You know how it works, it just turns it into an array with multiple values. not helpful if your code is expecting one string.
// STRATEGY
/*
Merge array1 and array2, overwriting 1st array values with 2nd array
values where they overlap. Use array1 as the base array and then add
in values from array2 as they exist.
Walk through each value in array2 and see if a value corresponds
in array1. If it does, overwrite with second array value. If it’s an
array, recursively execute this function and return the value. If it’s
a string, overwrite the value from array1 with the value from array2.
If a value exists in array2 that is not found in array1, add it to array1.
*/
This behavior also occurs if the value is the empty array.
In fact, in the above example, interchanging the empty array with
any and all occurences of NULL will yield the same result.
var_dump ( array_merge_recursive2 (array( ‘A’ => array( ‘A’ => 2 )), array( ‘A’ => array( ‘A’ => null ))));
/*
array(1) < ["A"]=>array(1) < ["A"]=>NULL > >
*/
This function tends to reindex arrays, which is not mentioned in the function description.
I just tried to run that function on a three dimensional array, containing errormessages.
The first dim. contains the severity of the error (‘warn’, ‘crit’) the second dim the linenumber (numerical) and the third one consists of errormessages
# Array printout:
Array
(
[ warn ] => Array // severity (associative)
(
[ 2 ] => Array // linenumber (numerical)
(
[ 0 ] => «Category does not exist»
[ 1 ] => «Manufacturer does not exist»
)
)
)
?>
If i now merge two or more of those arrays using array_merge_recursive(), the linenumbers are not conserved. Instead of, they are all renumbered, starting with 0.
Just thought anyone may want to know about that. 🙂
regards, smilingrasta
I ran into a fairly unique situation where array_merge_recursive ALMOST did what I wanted, but NOT QUITE. I read through all of the comments, and I didn’t find anything that really helped me. I saw a lot of functions submitted that were just trying to recreate array_replace_recursive. This is not that.
Take a look at the code and try it out. Hopefully it helps someone in need!
/** We can skip the rest of the loop */
continue;
>
Объединение данных с помощью массивов в PHP
Переменные, которые позволяют объединять данные по одному имени называются массивами. Например, переменная $city может иметь информацию о названии города, количестве жителей, площадь и другую полезную информация, которая легко поддается редактированию и обработке.
Создание массивов
Аналогично простой переменной, чтобы создать массив, необходимо присвоить ему значения:
После данного присваивания, массив $myArray будет содержать единственный єлемент со значением First. Посмотрим на следующий фрагмент кода:
Теперь массив $myArray содержит три значения: First, Second и Third.
Как видно из примера, массив являет собой набор пар ключ-значение (key/value). Ключ в массиве принято называть индексом (index), который может содержать в себе числа или строки.
Можно использовать также сокращенную запись добавления записей в массив:
При данном подходе создается массив с автоматической нумерацией индексов, которые являют собой числа, начиная с 0.
Можно еще более компактно выполнить вышеописанный код, использовав языковую конструкцию array:
При необходимости можно изменить индекс первого значения массива:
Аналогичным образом создаются массивы с текстовыми индексами. Например, для файла языка можно создать массив:
Также можно создать массив в определенном диапазоне, например:
В результате будет создан массив:
Вывод элементов массивов
Просмотреть структуру и значения массива можно воспользовавшись функцией var_dump. Например, опишем с помощью данной функции массив $color:
Результат выражения будет следующий:
Таким образом, мы увидим индексы, значение и тип данных каждого элемента массива. Строковый тип элемента массива определяется ключевым словом string.
Изменение массивов
Средствами PHP можно изменять значения, добавлять или удалять элементы и производить сортировку массивов. Например, изменять значения массива можно простым присваиванием:
Также можно легко копировать существующий массив в новый, например:
Удаление значений из массива
Для удаления значения массивов необходимо воспользоваться функцией unset:
При удалении элемента с необходимым индексом, все остальные остаются без изменений. Удаление элементов массива по отдельности не влечет за собой удаление самого массива. Для того чтобы удалить массив, необходимо использовать выражение:
Сортировка массивов
По умолчанию интерпретатор РНР размещает значения элементов массива в возрастающем порядке. При необходимости можно изменить порядок, например, в алфавитном, по индексу или по значению.
Для изменения порядка следования элементов массива следует воспользоваться функцией sort, которая после завершения работы перестанавливает элементы массива в порядке возрастания.
функция asort сортирует массив таким образом, что сохраняются отношения между ключами и значениями. Ее используют при необходимости сохранения отношения ключ=>значение.
Язык РНР предоставляет много полезных функций для сортировки массивов различными способами.
Использование массивов в выражениях
Значения отдельных элементов массива можно получать путем прямого доступа:
Если вы пытаетесь получить доступ к несуществующему массиву, отобразится сообщение об ошибке:
Использование массивов в функции list
В PHP существует функция list, которая позволяет копировать значения массивов в переменные. Например, создадим массив:
Продемонстрируем работу функции list:
В результате создадутся две переменные, $first и $second, которым будут присвоены значения первых двух элементов массива $myArray.
Перемещение по массивам
Для перебора элементов массива используют ручной перебор, который заключается в использовании указателя для перехода от одного элемента массива к другому, или оператор foreach, который позволяет поэлементно автоматически проходить по массиву от его начала до конца.
При ручном переборе массив представляется как список, который содержит указатель на его элементы. Указатель не изменяет свое положение до момента его перемещения. Для работы с указателем существуют следующие функции, аргументом которых и есть массив данных:
Для прохождения поэлементно всего массива существует оператор foreach, который позволяет выполнить набор инструкций со значениями и индексами. Общий синтаксис имеет вид:
В параметре $array указывается имя массива. Параметр $key являет собой переменную, которой будут присваиваться значения индексов элементов массива. Данный параметр можно не использовать, если будет достаточно только значения элемента. Переменной $value будут присваиваться значения элементов массива.
Рассмотрим следующий пример:
Результат примера:
Определение размера массива
Чтобы узнать размер массива в языке РНР предусмотрены две функции: count и sizeof. Их общий синтаксис имеет следующий вид:
Преобразование массивов в текстовые строки
Иногда необходимо переписать содержимое текстовой строки в массив. Для этого существует функция explode:
Аргумент символ является разделителем строки для преобразования строки в массив.
Рассмотрим пример:
Результатом будет массив:
Аналогичным образом, только наоборот, можно массив преобразовывать в строку. Для выполнения этой операции предназначена функция implode:
Результат выполнения функции implode будет строка, состоящая из элементов массива $array, разделенных параметром символ.
Преобразование переменных в массивы
Для сохранения элементов массива в переменные или наоборот в РНР предусмотрены функции extract и compact.
С помощью функции extract можно получить значения элементов массива и присваивать их переменным, именами которых являются соответствующие индексы.
Разбиение и слияние массивов
PHP позволяет объединять или разделять массивы. Для разбиения массива выполняется операция создания нового, содержащего подмножество элементов исходного. Общий синтаксис функции имеет следующий вид:
Функция array_slice выбирает срез массива и возвращает последовательность элементов массива array, определённую параметрами offset (начальный индекс нового массива) и length (длина нового массива).
Рассмотрим пример:
Существует также функция array_merge, которая объединяет различные массивы, используя следующее выражение:
Пример использования:
Суммирование массивов
Сложить все значения массива можно функцией array_sum, которая вычисляет сумму значений массива:
Можно также удалять повторяющиеся элементы в массиве. Для этого служит функция array_unique:
Для перестановки значений и ключей следует воспользоваться функцией array_flip, которая меняет местами ключи с их значениями в массиве:
Многомерные массивы
Весь список товаров можно объединить в одну группу. Это можно осуществить, используя многомерные массивы:
Массив $price является двумерным, поскольку представляет собой массив массивов.
Массивы, встроенные в PHP
Язык РНР имеет несколько встроенных массивов, в которых содержится различная полезная информация. Например, информация о сервере и среде исполнения сохраняются в массиве $_SERVER.
‘;
Результат выдаст значение переменных HTTP_HOST, HTTP_USER_AGENT, HTTP_ACCEPT, SystemRoot, SERVER_NAME, SCRIPT_FILENAME, QUERY_STRING, REQUEST_TIME и другие.