Php соединить два многомерных массива

PHP
Обработка нескольких массивов вместе

array_merge перезаписывает значения первого массива со значениями второго массива, если он не может перенумеровать индекс.

Вы можете использовать оператор + чтобы объединить два массива таким образом, чтобы значения первого массива никогда не перезаписывались, но они не перенумеровали числовые индексы, поэтому вы теряете значения массивов, которые имеют индекс, который также используется в первом массиве ,

$fruit1 = ['one' => 'apples', 'two' => 'pears']; $fruit2 = ['one' => 'bananas', 'two' => 'oranges']; $all_of_fruits = $fruit1 + $fruit2; // now value of $all_of_fruits is ['one' => 'apples', 'two' => 'pears'] $fruit1 = ['apples', 'pears']; $fruit2 = ['bananas', 'oranges']; $all_of_fruits = $fruit1 + $fruit2; // now value of $all_of_fruits is [0 => 'apples', 1 => 'pears'] 

Пересечение массива

Функция array_intersect вернет массив значений, которые существуют во всех массивах, которые были переданы этой функции.

$array_one = ['one', 'two', 'three']; $array_two = ['two', 'three', 'four']; $array_three = ['two', 'three']; $intersect = array_intersect($array_one, $array_two, $array_three); // $intersect contains ['two', 'three'] 

Клавиши массива сохраняются. Индексами из исходных массивов нет.

array_intersect проверяет только значения массивов. Функция array_intersect_assoc вернет пересечение массивов с помощью ключей.

$array_one = [1 => 'one',2 => 'two',3 => 'three']; $array_two = [1 => 'one', 2 => 'two', 3 => 'two', 4 => 'three']; $array_three = [1 => 'one', 2 => 'two']; $intersect = array_intersect_assoc($array_one, $array_two, $array_three); // $intersect contains [1 =>'one',2 => 'two'] 

Функция array_intersect_key проверяет только пересечение ключей. Он будет возвращать ключи во всех массивах.

$array_one = [1 => 'one',2 => 'two',3 => 'three']; $array_two = [1 => 'one', 2 => 'two', 3 => 'four']; $array_three = [1 => 'one', 3 => 'five']; $intersect = array_intersect_key($array_one, $array_two, $array_three); // $intersect contains [1 =>'one',3 => 'three'] 

Объединение двух массивов (ключи от одного, значения от другого)

В следующем примере показано, как объединить два массива в один ассоциативный массив, где ключевыми значениями будут элементы первого массива, а значения будут от второго:

$array_one = ['key1', 'key2', 'key3']; $array_two = ['value1', 'value2', 'value3']; $array_three = array_combine($array_one, $array_two); var_export($array_three); /* array ( 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3', ) */ 

Изменение многомерного массива на ассоциативный массив

Если у вас многомерный массив:

Читайте также:  XML Developer's Guide

И вы хотите изменить его на ассоциативный массив следующим образом:

Вы можете использовать этот код:

$multidimensionalArray = [ ['foo', 'bar'], ['fizz', 'buzz'], ]; $associativeArrayKeys = array_column($multidimensionalArray, 0); $associativeArrayValues = array_column($multidimensionalArray, 1); $associativeArray = array_combine($associativeArrayKeys, $associativeArrayValues); 

Или вы можете пропустить установку $associativeArrayKeys и $associativeArrayValues и использовать этот простой один лайнер:

$associativeArray = array_combine(array_column($multidimensionalArray, 0), array_column($multidimensionalArray, 1)); 
  • Начало работы с PHP
  • APCu
  • BC Math (бинарный калькулятор)
  • Imagick
  • IMAP
  • JSON
  • Loops
  • PDO
  • PHP MySQLi
  • php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
  • PHP Встроенный сервер
  • PHPDoc
  • PSR
  • SimpleXML
  • SQLite3
  • Streams
  • URL-адрес
  • UTF-8,
  • WebSockets
  • XML
  • YAML в PHP
  • Автозагрузка грунтовки
  • Альтернативный синтаксис для структур управления
  • Анализ HTML
  • Асинхронное программирование
  • Аутентификация HTTP
  • Безопасность
  • Буферизация вывода
  • Вклад в PHP Core
  • Внедрение зависимости
  • Внесение изменений в Руководство по PHP
  • Волшебные константы
  • Волшебные методы
  • Вывод значения переменной
  • Выполнение по массиву
  • Генераторы
  • закрытие
  • Защитите Remeber Me
  • Интерфейс командной строки (CLI)
  • Использование cURL в PHP
  • Использование MongoDB
  • Использование Redis с PHP
  • Использование SQLSRV
  • Итерация массива
  • Как определить IP-адрес клиента
  • Как разбить URL-адрес
  • Класс Datetime
  • Классы и объекты
  • Клиент SOAP
  • Комментарии
  • Компилировать расширения PHP
  • Компиляция ошибок и предупреждений
  • Константы
  • Контрольные структуры
  • криптография
  • кэш
  • локализация
  • Манипулирование массивом
  • Манипуляции заголовков
  • Массивы
  • Машинное обучение
  • Менеджер зависимостей композитора
  • Многопоточное расширение
  • многопроцессорная обработка
  • Монго-PHP
  • Область переменных
  • Обработка изображений с помощью GD
  • Обработка исключений и отчетов об ошибках
  • Обработка нескольких массивов вместе
  • Обработка файлов
  • Общие ошибки
  • операторы
  • отладка
  • Отправка электронной почты
  • отражение
  • переменные
  • Переменные Superglobal PHP
  • Печенье
  • Поддержка Unicode в PHP
  • Пространства имен
  • Работа с датами и временем
  • Развертывание докеров
  • Регулярные выражения (regexp / PCRE)
  • Рекомендации
  • Рецепты
  • Розетки
  • Сервер SOAP
  • Сериализация
  • Сериализация объектов
  • сессии
  • Соглашения о кодировании
  • Создание PDF-файлов в PHP
  • Спектакль
  • Строковый анализ
  • Структуры данных SPL
  • Тестирование устройства
  • Тип жонглирования и нерегулярные проблемы сравнения
  • Тип подсказки
  • Типы
  • Установка в средах Linux / Unix
  • Установка среды PHP в Windows
  • Фильтры и функции фильтра
  • Форматирование строк
  • функции
  • Функции хеширования пароля
  • Функциональное программирование
  • Черты
  • Чтение данных запроса
  • Шаблоны проектирования

Источник

array_merge

Сливает элементы одного или большего количества массивов таким образом, что значения одного массива присоединяются к концу предыдущего. Результатом работы функции является новый массив.

Если входные массивы имеют одинаковые строковые ключи, тогда каждое последующее значение будет заменять предыдущее. Однако, если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено в конец массива.

В результирующем массиве значения исходного массива с числовыми ключами будут перенумерованы в возрастающем порядке, начиная с нуля.

Список параметров

Возвращаемые значения

Возвращает результирующий массив. Если вызывается без аргументов, возвращает пустой массив ( array ).

Список изменений

Версия Описание
7.4.0 Функция теперь может быть вызвана без каких-либо параметров. Ранее требовался хотя бы один параметр.

Примеры

Пример #1 Пример использования array_merge()

$array1 = array( «color» => «red» , 2 , 4 );
$array2 = array( «a» , «b» , «color» => «green» , «shape» => «trapezoid» , 4 );
$result = array_merge ( $array1 , $array2 );
print_r ( $result );
?>

Результат выполнения данного примера:

Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid [4] => 4 )

Пример #2 Простой пример использования array_merge()

Помните, что числовые ключи будут перенумерованы!

Если вы хотите дополнить первый массив элементами второго без перезаписи элементов первого массива и без переиндексации, используйте оператор объединения массивов + :

$array1 = array( 0 => ‘zero_a’ , 2 => ‘two_a’ , 3 => ‘three_a’ );
$array2 = array( 1 => ‘one_b’ , 3 => ‘three_b’ , 4 => ‘four_b’ );
$result = $array1 + $array2 ;
var_dump ( $result );
?>

Ключи из первого массива будут сохранены. Если ключ массива существует в обоих массивах, то будет использован элемент из первого массива, а соответствующий элемент из второго массива будет проигнорирован.

array(5) < [0]=>string(6) "zero_a" [2]=> string(5) "two_a" [3]=> string(7) "three_a" [1]=> string(5) "one_b" [4]=> string(6) "four_b" >

Пример #3 Пример использования array_merge() с не массивами

$beginning = ‘foo’ ;
$end = array( 1 => ‘bar’ );
$result = array_merge ((array) $beginning , (array) $end );
print_r ( $result );
?>

Результат выполнения данного примера:

Смотрите также

  • array_merge_recursive() — Рекурсивное слияние одного или более массивов
  • array_replace() — Заменяет элементы массива элементами других переданных массивов
  • array_combine() — Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
  • Операторы, работающие с массивами

User Contributed Notes 8 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.

$array1 [ 0 ] = «zero» ;
$array1 [ 1 ] = «one» ;

$array2 [ 1 ] = «one» ;
$array2 [ 2 ] = «two» ;
$array2 [ 3 ] = «three» ;

$array3 = array( 0 => «zero» , 1 => «one» , 2 => «two» , 3 => «three» );

?>

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.

I wished to point out that while other comments state that the spread operator should be faster than array_merge, I have actually found the opposite to be true for normal arrays. This is the case in both PHP 7.4 as well as PHP 8.0. The difference should be negligible for most applications, but I wanted to point this out for accuracy.

Below is the code used to test, along with the results:

for ( $i = 0 ; $i < 10000000 ; $i ++) $array1 = [ 'apple' , 'orange' , 'banana' ];
$array2 = [ ‘carrot’ , ‘lettuce’ , ‘broccoli’ ];

$after = microtime ( true );
echo ( $after — $before ) . » sec for spread\n» ;

for ( $i = 0 ; $i < 10000000 ; $i ++) $array1 = [ 'apple' , 'orange' , 'banana' ];
$array2 = [ ‘carrot’ , ‘lettuce’ , ‘broccoli’ ];

$array1 = array_merge ( $array1 , $array2 );
>

$after = microtime ( true );
echo ( $after — $before ) . » sec for array_merge\n» ;
?>

PHP 7.4:
1.2135608196259 sec for spread
1.1402177810669 sec for array_merge

PHP 8.0:
1.1952061653137 sec for spread
1.099925994873 sec for array_merge

In addition to the text and Julian Egelstaffs comment regarding to keep the keys preserved with the + operator:
When they say «input arrays with numeric keys will be renumbered» they MEAN it. If you think you are smart and put your numbered keys into strings, this won’t help. Strings which contain an integer will also be renumbered! I fell into this trap while merging two arrays with book ISBNs as keys. So let’s have this example:

$test1 [ ’24’ ] = ‘Mary’ ;
$test1 [ ’17’ ] = ‘John’ ;

$test2 [ ’67’ ] = ‘Phil’ ;
$test2 [ ’33’ ] = ‘Brandon’ ;

$result1 = array_merge ( $test1 , $test2 );
var_dump ( $result1 );

$result2 = [. $test1 , . $test2 ]; // mentioned by fsb
var_dump ( $result2 );
?>

You will get both:

Use the + operator or array_replace, this will preserve — somewhat — the keys:

$result1 = array_replace ( $test1 , $test2 );
var_dump ( $result1 );

$result2 = $test1 + $test2 ;
var_dump ( $result2 );
?>

You will get both:

The keys will keep the same, the order will keep the same, but with a little caveat: The keys will be converted to integers.

We no longer need array_merge() as of PHP 7.4.

Not to contradict ChrisM’s test, but I ran their code example and I got very different results for PHP 8.0.

Testing PHP 8.0.14
1.4955070018768 sec for spread
4.4120140075684 sec for array_merge

If you’re trying to merge an array with something that evaluates to NULL, you’ll get unpredictable results:

$c = array_merge ( $a , $b ); // this won’t work
echo «The merged array is:» ;
var_dump ( $c );
?>

Depending on your error setting, you might not even get anything at all.

array(3) [0]=>
string(1) «1»
[1]=>
string(1) «2»
[2]=>
string(1) «4»
>
NULL
PHP Warning: array_merge(): Expected parameter 2 to be an array, null given in /home/gwyneth/stupid-test.php on line 8
The merged array is: NULL

array(3) [0]=>
string(1) «1»
[1]=>
string(1) «2»
[2]=>
string(1) «4»
>
NULL
PHP Fatal error: Uncaught TypeError: array_merge(): Argument #2 must be of type array, null given in /home/gwyneth/stupid-test.php:8
Stack trace:
#0 /home/gwyneth/stupid-test.php(8): array_merge()
#1
thrown in /home/gwyneth/stupid-test.php on line 8

Depending on your display/debug settings, you might not even get anything.

The solution, of course, is to do a quick & dirty test before passing the 2nd argument:

$c = array_merge ( $a , $b ?? []);
echo «The merged array is:» ;
var_dump ( $c );
?>

Which gives the expected result (PHP 7.4 to PHP 8.2):

While it’s perfectly legitimate to merge empty arrays, null is *not* an empty array!

Источник

Оцените статью