W3docs

Функция 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. Их значения не используются.

Элемент остаётся в результате только в том случае, если его ключ присутствует во всех переданных массивах. Исходные пары ключ/значение из первого массива сохраняются в результате без изменений.

Примеры

Сравнение двух массивов

php— editable, runs on the server

Ключи, общие для обоих массивов, — это a и b, поэтому именно эти элементы сохраняются. Обратите внимание, что значения для ключа b различаются (brown и yellow) — это не имеет значения, совпасть должен только ключ, а значение берётся из $array1. Элемент "red" в $array1 имеет неявный числовой ключ 0, которого нет в $array2, поэтому он исключается:

Array
(
    [a] => green
    [b] => brown
)

Сравнение трёх массивов

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

php— editable, runs on the server

Только ключ 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_key() в PHP?
Что делает функция array_intersect_key() в PHP?
Was this page helpful?