W3docs

Функция array_intersect_assoc() в PHP

Функция array_intersect_assoc() в PHP сравнивает массивы и возвращает только элементы, совпадающие по ключу и значению во всех массивах.

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

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

Синтаксис

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

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

Как это работает

array_intersect_assoc() перебирает каждую пару ключ => значение первого массива и ищет тот же ключ в каждом другом массиве. Пара сохраняется только в том случае, если для каждого другого массива этот ключ существует и его значение совпадает.

Один нюанс часто вызывает путаницу: сравнение значений не является строгим (===). Внутри PHP сравнивает значения как строки, примерно по принципу (string) $a === (string) $b. Так, 1 (int) совпадает с "1" (string), поскольку оба преобразуются в "1", но false не совпадает с 0 (они преобразуются в "" и "0" соответственно). Ключи, как всегда в PHP-массивах, следуют обычным правилам для ключей массивов.

Базовый пример

Здесь единственная пара, общая для обоих массивов — с одинаковым ключом и значением — это "a" => "green":

php— editable, runs on the server

Вывод этого кода будет следующим:

Array
(
    [a] => green
)

"b" исключается, потому что значения различаются (brown и yellow), "c" — по той же причине (blue и red). Элемент "red" в $array1 имеет целочисленный ключ 0, которого нет в $array2, поэтому он тоже исключается. В этом и состоит отличие от array_intersect(), которая совпала бы по red только на основании значения.

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

Пара должна совпадать во всех массивах, чтобы попасть в результат. Добавление третьего массива ещё больше сужает результат:

<?php

$array1 = array("a" => "green", "b" => "brown", "c" => "blue");
$array2 = array("a" => "green", "b" => "yellow");
$array3 = array("a" => "green", "c" => "blue");
$result = array_intersect_assoc($array1, $array2, $array3);
print_r($result);

?>

Вывод:

Array
(
    [a] => green
)

Только "a" => "green" присутствует во всех массивах. "c" => "blue" отсутствует в $array2, поэтому она отбрасывается.

Ловушка: нестрогое сравнение значений

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

<?php

$a = array("id" => 1,   "active" => false);
$b = array("id" => "1", "active" => 0);

print_r(array_intersect_assoc($a, $b));

?>

Вывод:

Array
(
    [id] => 1
)

id совпадает, потому что 1 и "1" оба преобразуются в строку "1". Но active исключается: false преобразуется в "", а 0 — в "0", поэтому они не равны. Если вам нужно строгое сравнение с учётом типов, сравнивайте массивы вручную или используйте array_uintersect_assoc() с пользовательским коллбэком.

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

  • Сравнение ассоциативных массивов, где значение имеет смысл только при конкретном ключе — настройки, поля формы, структуры, похожие на строки базы данных.
  • Поиск общих элементов между двумя снимками одних и тех же ключевых данных.

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

Диаграмма

Наглядное представление того, как array_intersect_assoc() фильтрует пары:

graph LR
A[Array 1: key-value pairs] -->|Compare keys & values| B[Array 2: key-value pairs]
B -->|Keep only matching pairs| C[Result Array]

Заключение

array_intersect_assoc() возвращает пары ключ => значение, общие для всех переданных массивов, сравнивая и ключ, и значение (нестрого, как строку). Используйте её, когда должны совпадать и метка, и значение элемента, а для сравнения только по значению, только по ключу или с использованием строгого пользовательского сравнения предпочтите array_intersect(), array_intersect_key() или array_uintersect_assoc().

Практика

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