Функция array_combine() в PHP
Функция array_combine() в PHP объединяет два массива в один ассоциативный, используя значения первого в качестве ключей, а второго — в качестве значений.
Функция array_combine() в PHP объединяет два плоских массива в один ассоциативный массив: она берёт значения первого массива в качестве ключей, а значения второго массива — в качестве значений. Это идеальный инструмент, когда у вас есть два параллельных массива — например, список названий столбцов и список значений ячеек, совпадающих по позиции, — и вы хотите объединить их в единую карту ключ/значение.
На этой странице рассматриваются синтаксис, смысл каждого параметра и возвращаемого значения, обязательные правила (одинаковая длина, допустимые типы ключей), а также наиболее распространённые практические шаблоны.
Синтаксис
array_combine(array $keys, array $values): array| Параметр | Описание |
|---|---|
$keys | Array, значения которого становятся ключами результата. Его значения должны быть допустимыми ключами массива (целые числа или string). |
$values | Array, значения которого становятся значениями результата. |
Возвращаемое значение: новый ассоциативный array, построенный путём сопоставления каждого элемента $keys с элементом $values на той же позиции.
Начиная с PHP 8.0, передача массивов разной длины вызывает исключение ValueError. В PHP 7.x и более ранних версиях функция возвращала false и генерировала предупреждение.
Базовое использование
Классический пример — преобразование двух параллельных массивов в одну карту: здесь названия товаров сопоставляются с их ценами.
Результат вывода:
Array
(
[Product 1] => 10
[Product 2] => 20
[Product 3] => 30
)Объединение выполняется по позиции, а не по сортировке или совпадению — первый ключ сопоставляется с первым значением, второй — со вторым, и так далее.
Формирование записи из заголовков и данных
Часто встречающийся практический случай — восстановление ассоциативной записи из строки заголовков CSV-формата и строки данных. Именно так можно сопоставить одну строку разобранного CSV-файла.
<?php
$headers = array("id", "name", "email");
$row = array(101, "Ann", "[email protected]");
$record = array_combine($headers, $row);
echo $record["name"] . " <" . $record["email"] . ">";Результат:
Ann <[email protected]>Правила и подводные камни
Помните об этих ограничениях:
- Одинаковая длина обязательна.
$keysи$valuesдолжны содержать одинаковое количество элементов. В PHP 8+ несовпадение вызываетValueError; используйте проверкуcount($keys) === count($values), если длина заранее неизвестна. - Ключи должны быть допустимыми. Значения, используемые как ключи, должны быть целыми числами или string. Числа с плавающей точкой усекаются до целых, boolean приводятся к
0/1, а null становится пустой строкой"". - Дублирующиеся ключи перезаписываются. Если array
$keysсодержит повторяющиеся значения, последующие пары перезаписывают предыдущие, и результат может оказаться короче входных данных. Чтобы заранее узнать количество уникальных ключей, используйтеarray_unique(). - Используются только значения. Исходные ключи обоих входных массивов игнорируются — имеют значение только их значения.
Пример ниже показывает, как дублирующийся ключ объединяет две записи в одну:
<?php
$keys = array("a", "b", "a");
$values = array(1, 2, 3);
print_r(array_combine($keys, $values));Последнее "a" => 3 перезаписывает первое, поэтому результат:
Array
(
[a] => 3
[b] => 2
)Связанные функции
array_merge()— объединяет массивы путём добавления значений, а не сопоставления ключей со значениями.array_flip()— меняет местами ключи и значения одного массива.array_keys()иarray_values()— обратная операция: извлекают ключи или значения из ассоциативного массива.
Заключение
array_combine() — самый удобный способ объединить два параллельных массива в ассоциативный, сопоставляя их поэлементно. Запомните два правила, которые чаще всего вызывают затруднения: массивы должны быть одинаковой длины (иначе в PHP 8+ возникает ValueError), а дублирующиеся ключи молча перезаписывают друг друга.