W3docs

Функция пересечения массивов PHP: руководство по array_intersect

Узнайте, как работает array_intersect() в PHP: синтаксис, сравнение значений, сохранение ключей и практические примеры использования.

Функция array_intersect() сравнивает два или более массива и возвращает значения, которые присутствуют во всех них. Это одна из наиболее полезных операций над множествами в PHP — незаменима, когда нужно ответить на вопрос «какие элементы встречаются в каждом списке?»: например, найти общие теги, совпадающие права доступа или товары, которые есть сразу в двух каталогах.

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

Синтаксис

array_intersect(array $array, array ...$arrays): array
  • $array — массив, значения которого проверяются на наличие во всех остальных.
  • ...$arrays — один или несколько дополнительных массивов для сравнения.

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

Два важных момента:

  • Сравниваются только значения, не ключи. При сопоставлении ключи игнорируются, однако ключи из первого массива сохраняются в результате.
  • По умолчанию сравнение нестрогое. Внутри PHP сравнивает элементы как строки: (string) $a === (string) $b. Поэтому целое число 1 и строка "1" считаются равными. Используйте array_intersect_assoc(), если ключи тоже должны совпадать, или array_intersect_key(), чтобы пересекать массивы по ключам, а не по значениям.

Если любой из аргументов — пустой массив, результат всегда будет пустым: ничто не может быть общим со списком, в котором нет элементов.

Примеры

Пример 1: пересечение двух массивов

Сравниваем два массива и оставляем только значения, найденные в обоих.

php— editable, runs on the server

Вывод:

Array
(
    [2] => c
    [3] => d
)

"c" и "d" присутствуют в обоих массивах. Обратите внимание на ключи: 2 и 3 взяты из $array1, первого аргумента — array_intersect() сохраняет исходные ключи, а не переиндексирует результат. Если нужен чистый индекс 0, 1, 2 …, оберните результат в array_values().

Пример 2: пересечение нескольких массивов

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

php— editable, runs on the server

Вывод:

Array
(
)

Результат пуст: ни одно значение не является общим для всех трёх массивов. "c"/"d" отсутствуют в $array3, а "e"/"f" — в $array1.

Пример 3: особенности нестрогого сравнения

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

<?php

$numbers = array(1, 2, 3, 4);
$strings = array("2", "4", "6");

$result = array_intersect($numbers, $strings);

print_r($result);

?>

Вывод:

Array
(
    [1] => 2
    [3] => 4
)

Целое число 2 совпало со строкой "2", а 4 — с "4", несмотря на то что они разных типов. Возвращаемые значения берутся из первого массива, поэтому здесь они остаются целыми числами. Если важна точная проверка типов, фильтруйте результат самостоятельно или используйте более строгую логику сравнения.

Когда использовать

Используйте array_intersect(), когда нужно найти общие значения нескольких списков. Несколько практических случаев:

  • Найти роли, которые пользователь имеет сразу в двух наборах разрешений.
  • Показать товары, которые есть в двух складских каталогах.
  • Проверить, какие из запрошенных полей действительно разрешены (array_intersect($requested, $whitelist)).

Для противоположной операции — значений, которые не являются общими — см. array_diff(). Чтобы объединить массивы вместо пересечения, используйте array_merge(), а для проверки одиночного значения — in_array().

Заключение

array_intersect() возвращает значения, присутствующие во всех переданных массивах, сохраняя ключи первого аргумента и сравнивая элементы нестрого — как строки. Не забывайте обращаться к array_intersect_assoc() или array_intersect_key(), когда важны ключи, и к array_values(), когда нужна переиндексация результата.

Практика

Практика
Что делает функция array_intersect() в PHP?
Что делает функция array_intersect() в PHP?
Was this page helpful?