Как объединить массивы в PHP разными способами

Как объединить массивы php

Как объединить массивы php

При работе с данными в PHP часто возникает задача объединить несколько массивов в один. От выбора метода зависит не только читаемость кода, но и итоговая структура данных: сохранение или перезапись ключей, скорость обработки, возможность работы с многомерными структурами.

Функция array_merge() объединяет массивы поэлементно, перезаписывая значения одинаковых строковых ключей и переиндексируя числовые. Это удобно для случаев, когда важен результат в виде последовательного списка. Если же необходимо сохранить все значения даже при совпадении ключей, то лучше использовать оператор +, который оставляет данные первого массива без изменений.

Для более сложных случаев применяют array_merge_recursive(), где одинаковые ключи превращаются в подмассивы, а не затираются. Такой способ подходит, если нужно аккуратно объединить данные из разных источников без потери информации. При необходимости строгого контроля за ключами можно задействовать array_replace() и array_replace_recursive(), которые заменяют значения по совпадающим ключам без изменения структуры индексов.

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

Объединение массивов с помощью array_merge()

Объединение массивов с помощью array_merge()

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

  • Числовые ключи: индексы формируются заново, начиная с 0.
  • Строковые ключи: значения заменяются при совпадении ключей.
  • Пустые массивы: игнорируются без ошибок.

Пример:


$a = [1, 2, 3];
$b = [4, 5];
$result = array_merge($a, $b);
// Результат: [1, 2, 3, 4, 5]

$a = ["id" => 1, "name" => "Alex"];
$b = ["name" => "Ivan", "age" => 30];
$result = array_merge($a, $b);
// Результат: ["id" => 1, "name" => "Ivan", "age" => 30]

Рекомендации:

  1. Используйте array_merge(), когда нужно объединить данные и сохранить актуальные значения строковых ключей.
  2. Для добавления числовых элементов без перезаписи ключей применяйте оператор +, а не array_merge().
  3. Если массивы могут содержать null или пустые значения, предварительно фильтруйте их с помощью array_filter().

Слияние массивов с сохранением ключей через оператор +

Оператор + объединяет массивы без перезаписи существующих ключей. При совпадении ключей сохраняются элементы из левого массива, а значения правого массива игнорируются.

Пример:

$a = [0 => 'PHP', 1 => 'MySQL', 2 => 'HTML'];
$b = [1 => 'Python', 3 => 'CSS'];
$result = $a + $b;
// Результат: [0 => 'PHP', 1 => 'MySQL', 2 => 'HTML', 3 => 'CSS']

Такой подход эффективен для случаев, когда важно сохранить исходные данные, а дополнительные значения добавить только по уникальным ключам.

Особенности:

  • Порядок массивов критичен: приоритет всегда у левого.
  • Числовые и строковые ключи обрабатываются одинаково.
  • Подходит для массивов с фиксированными ключами (например, настройки или словари).

Если требуется именно перезапись значений при совпадении ключей, вместо + стоит использовать array_replace() или array_merge().

Комбинация массивов с использованием array_merge_recursive()

Функция array_merge_recursive() объединяет массивы по ключам, но в отличие от array_merge() при совпадении ключей не перезаписывает значения, а формирует вложенный массив. Это удобно для структур с одинаковыми ключами, где нужно сохранить все варианты данных.

Пример:

$a = ["id" => 1, "tags" => ["php", "arrays"]];
$b = ["id" => 2, "tags" => ["merge", "recursive"]];
$result = array_merge_recursive($a, $b);
print_r($result);

Результат:

Array
(
[id] => Array
(
[0] => 1
[1] => 2
)
[tags] => Array
(
[0] => php
[1] => arrays
[2] => merge
[3] => recursive
)
)

Особенности:

Ситуация Поведение
Совпадающие строковые ключи Значения объединяются во вложенный массив
Совпадающие числовые ключи Элементы добавляются в конец, ключи перенумеровываются
Разные ключи Все значения включаются без изменений

Рекомендация: использовать array_merge_recursive() при необходимости сохранить все значения по одинаковым ключам, например, при работе с конфигурациями, параметрами фильтров или тегами. Если требуется перезапись значений, лучше применять array_replace_recursive().

Создание ассоциативного массива с помощью array_combine()

Функция array_combine() формирует новый массив, где один массив используется как ключи, а другой – как значения. Синтаксис:

array array_combine ( array $keys , array $values )

Пример:

$keys = ['id', 'name', 'email'];
$values = [1, 'Иван', 'ivan@example.com'];
$result = array_combine($keys, $values);
/*
$result:
[
'id' => 1,
'name' => 'Иван',
'email' => 'ivan@example.com'
]
*/

Размеры массивов $keys и $values должны совпадать, иначе вызов вернёт false и сгенерирует предупреждение. Чтобы избежать ошибок, перед объединением проверяйте количество элементов с помощью count().

Если требуется преобразовать массив значений в ассоциативный с числовыми ключами, вместо array_combine() удобнее использовать array_values() или оператор foreach. Но когда нужно чёткое сопоставление «ключ–значение», array_combine() остаётся оптимальным решением.

Добавление элементов одного массива в конец другого через array_push()

Добавление элементов одного массива в конец другого через array_push()

Функция array_push() принимает массив по ссылке и добавляет в его конец один или несколько элементов. При этом индексы для новых значений назначаются автоматически, начиная с максимального существующего.

Если требуется объединить два массива, второй можно передать в array_push() с оператором разворота .... Такой подход исключает вложенность и сохраняет линейную структуру:

$a = [1, 2, 3];
$b = [4, 5, 6];
array_push($a, ...$b);
// Результат: [1, 2, 3, 4, 5, 6]

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

Для добавления одного элемента вызов может быть короче, чем через оператор [], однако при массовом объединении именно использование array_push() с разворотом массива делает код читаемым и контролируемым.

Использование функции array_replace() для замены значений

Использование функции array_replace() для замены значений

Функция array_replace() объединяет массивы так, что элементы из последующих массивов заменяют значения в предыдущих по одинаковым ключам. При этом ключи, которых нет в первом массиве, будут добавлены.

  • Замена производится только по существующим ключам.
  • Новые элементы из второго массива будут добавлены в итоговый.
  • Ассоциативные и числовые ключи обрабатываются одинаково.

Пример использования:


$base = ["a" => 1, "b" => 2, "c" => 3];
$override = ["b" => 20, "d" => 40];
$result = array_replace($base, $override);
// Результат: ["a" => 1, "b" => 20, "c" => 3, "d" => 40]

Функция принимает неограниченное количество массивов, обрабатывая их по порядку:


$a1 = ["x" => 1, "y" => 2];
$a2 = ["y" => 200];
$a3 = ["z" => 300];
$result = array_replace($a1, $a2, $a3);
// Итог: ["x" => 1, "y" => 200, "z" => 300]

Практические рекомендации:

  1. Используйте для подстановки значений по умолчанию и их переопределения.
  2. Применяйте при работе с конфигурационными массивами, где требуется сохранить структуру и заменить отдельные ключи.
  3. Для вложенных массивов применяйте array_replace_recursive(), чтобы значения заменялись на глубоком уровне.

Применение Spread-оператора (.) для объединения массивов

В PHP 7.4 появился Spread-оператор (…) для массивов, позволяющий разворачивать их элементы в новый массив. В отличие от функций array_merge() или оператора +, при использовании Spread-оператора всегда создаётся новый массив, а числовые ключи перенумеровываются автоматически.

Пример объединения:

$a = [1, 2];
$b = [3, 4];
$result = [...$a, ...$b];
// Результат: [1, 2, 3, 4]

Можно добавлять отдельные элементы между массивами:

$first = ['PHP', 'Python'];
$second = ['Go', 'Rust'];
$merged = [...$first, 'C++', ...$second];
// Результат: ['PHP', 'Python', 'C++', 'Go', 'Rust']

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

$x = ['lang' => 'PHP', 'year' => 1995];
$y = ['lang' => 'Python'];
$z = [...$x, ...$y];
// Результат: ['lang' => 'Python', 'year' => 1995]

Сравнение методов:

Метод Перенумерация ключей Сохранение строковых ключей Перезапись при конфликте
Spread (…) Да Да Да
array_merge() Да Да Да
Оператор + Нет Да Нет

Spread-оператор удобен для лаконичного объединения массивов в функциональном стиле, особенно когда необходимо явно указать порядок и легко добавлять новые элементы.

Слияние массивов с фильтрацией и преобразованием данных

При объединении массивов часто требуется исключить лишние элементы или изменить структуру данных. Для этого удобно использовать функции array_merge совместно с array_filter и array_map.

Пример: нужно объединить списки пользователей, убрать дубли по идентификатору и привести имена к единому формату.


 1, 'name' => 'Иван'],
['id' => 2, 'name' => 'Петр']
];
$users2 = [
['id' => 2, 'name' => 'Петя'],
['id' => 3, 'name' => 'Сергей']
];
$merged = array_merge($users1, $users2);
// Удаление дубликатов по "id"
$unique = [];
foreach ($merged as $user) {
$unique[$user['id']] = $user;
}
// Преобразование имен в верхний регистр
$result = array_map(function($u) {
$u['name'] = mb_strtoupper($u['name']);
return $u;
}, $unique);
print_r(array_values($result));
?>

Такой подход позволяет контролировать каждое преобразование: объединение выполняется стандартными средствами, дубли корректно удаляются, а форматирование имён осуществляется функцией array_map. Итоговый массив содержит только уникальные записи в заданном виде.

Вопрос-ответ:

Какой способ объединения массивов в PHP самый простой?

Самый прямой вариант — оператор «+». Он складывает массивы по ключам: если ключ совпадает, берётся значение из первого массива, а из второго игнорируется. Это удобно, когда нужно сохранить уникальные ключи и не допустить их перезаписи.

Ссылка на основную публикацию