Функция PHP array_intersect_key(): полное руководство
Узнайте, как функция PHP array_intersect_key() сравнивает массивы по ключам и возвращает совпадающие элементы из первого массива.
Функция PHP array_intersect_key() сравнивает два или более массива по их ключам и возвращает новый array, содержащий элементы из первого массива, ключи которых присутствуют во всех остальных массивах. Важно отметить, что значения при этом полностью игнорируются — только ключи определяют, что будет сохранено, а возвращаемые значения всегда берутся из первого массива. На этой странице рассматривается принцип работы функции, случаи её применения и типичные подводные камни.
Назначение
array_intersect_key() отвечает на вопрос: «Какие элементы этого массива присутствуют — по ключу — во всех остальных массивах?» Типичный практический пример — «белый список» полей формы или конфигурации: вы сохраняете только явно разрешённые ключи и отбрасываете всё остальное одним вызовом.
Функция относится к тому же семейству, что и array_intersect(), сравнивающая по значению, и array_diff_key(), возвращающая ключи, которые отсутствуют в других массивах.
Синтаксис
array_intersect_key(array $array, array ...$arrays): array| Параметр | Описание |
|---|---|
$array | Массив, из которого берутся элементы. Его ключи проверяются по всем остальным массивам, а его значения возвращаются в результате. |
$arrays | Один или несколько массивов, ключи которых сравниваются с $array. Их значения не используются. |
Элемент остаётся в результате только в том случае, если его ключ присутствует во всех переданных массивах. Исходные пары ключ/значение из первого массива сохраняются в результате без изменений.
Примеры
Сравнение двух массивов
Ключи, общие для обоих массивов, — это a и b, поэтому именно эти элементы сохраняются. Обратите внимание, что значения для ключа b различаются (brown и yellow) — это не имеет значения, совпасть должен только ключ, а значение берётся из $array1. Элемент "red" в $array1 имеет неявный числовой ключ 0, которого нет в $array2, поэтому он исключается:
Array
(
[a] => green
[b] => brown
)Сравнение трёх массивов
При передаче более двух массивов ключ должен присутствовать в каждом из них, чтобы остаться в результате.
Только ключ a присутствует во всех трёх массивах. Ключ b отсутствует в $array3, а ключ c — в $array2, поэтому оба исключаются:
Array
(
[a] => green
)Фильтрация массива по белому списку ключей
Наиболее практичный способ использования array_intersect_key() — фильтрация ассоциативного массива до разрешённого набора ключей, например, приём только известных полей из пользовательского ввода:
<?php
$input = array(
"name" => "Ann",
"email" => "[email protected]",
"is_admin" => true, // attacker-supplied field we must ignore
);
$allowed = array("name" => "", "email" => "");
$safe = array_intersect_key($input, $allowed);
print_r($safe);
?>Значения массива $allowed не важны — он служит исключительно списком разрешённых ключей. Опасное поле is_admin будет удалено:
Array
(
[name] => Ann
[email] => [email protected]
)Важные особенности
- Сравниваются только ключи, но не значения. Два элемента с одинаковым ключом, но разными значениями всё равно считаются совпадающими. Возвращаемые значения всегда берутся из первого массива.
- Порядок массивов не влияет на то, какие ключи остаются в результате, но порядок элементов в результате соответствует порядку первого массива.
- Сравнение ключей чувствительно к регистру для string-ключей:
"A"и"a"— разные ключи. - Числовые ключи сравниваются как целые числа. String-ключ
"1"и целочисленный ключ1считаются одним и тем же ключом, поскольку PHP нормализует строковые числовые ключи array к целым числам. - Передача единственного массива просто возвращает его без изменений; передача аргумента, не являющегося array, вызывает
TypeError.
Связанные функции
array_intersect()— пересечение по значению, а не по ключу.array_intersect_assoc()— совпадение и ключа, и значения.array_diff_key()— обратная операция: сохраняет элементы, чьи ключи отсутствуют в других массивах.array_key_exists()— проверка существования одного ключа.- Работа с массивами PHP — расширенный справочник по массивам.