Функция 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":
Вывод этого кода будет следующим:
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().