
При работе с данными в PHP часто возникает задача объединить несколько массивов в один. От выбора метода зависит не только читаемость кода, но и итоговая структура данных: сохранение или перезапись ключей, скорость обработки, возможность работы с многомерными структурами.
Функция array_merge() объединяет массивы поэлементно, перезаписывая значения одинаковых строковых ключей и переиндексируя числовые. Это удобно для случаев, когда важен результат в виде последовательного списка. Если же необходимо сохранить все значения даже при совпадении ключей, то лучше использовать оператор +, который оставляет данные первого массива без изменений.
Для более сложных случаев применяют array_merge_recursive(), где одинаковые ключи превращаются в подмассивы, а не затираются. Такой способ подходит, если нужно аккуратно объединить данные из разных источников без потери информации. При необходимости строгого контроля за ключами можно задействовать array_replace() и array_replace_recursive(), которые заменяют значения по совпадающим ключам без изменения структуры индексов.
Каждый из этих инструментов решает свою задачу, и правильный выбор зависит от требований к уникальности ключей, порядку элементов и сохранению исходных данных.
Объединение массивов с помощью 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]
Рекомендации:
- Используйте
array_merge(), когда нужно объединить данные и сохранить актуальные значения строковых ключей. - Для добавления числовых элементов без перезаписи ключей применяйте оператор
+, а неarray_merge(). - Если массивы могут содержать 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() с оператором разворота .... Такой подход исключает вложенность и сохраняет линейную структуру:
$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() объединяет массивы так, что элементы из последующих массивов заменяют значения в предыдущих по одинаковым ключам. При этом ключи, которых нет в первом массиве, будут добавлены.
- Замена производится только по существующим ключам.
- Новые элементы из второго массива будут добавлены в итоговый.
- Ассоциативные и числовые ключи обрабатываются одинаково.
Пример использования:
$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]
Практические рекомендации:
- Используйте для подстановки значений по умолчанию и их переопределения.
- Применяйте при работе с конфигурационными массивами, где требуется сохранить структуру и заменить отдельные ключи.
- Для вложенных массивов применяйте
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 самый простой?
Самый прямой вариант — оператор «+». Он складывает массивы по ключам: если ключ совпадает, берётся значение из первого массива, а из второго игнорируется. Это удобно, когда нужно сохранить уникальные ключи и не допустить их перезаписи.
