Функция PHP array_diff_assoc
Функция PHP array_diff_assoc сравнивает два и более массива и возвращает различия между ними на основе ключей и значений.
Функция PHP array_diff_assoc() сравнивает два или более массива и возвращает элементы первого массива, которые отсутствуют во всех остальных. В отличие от array_diff(), которая сравнивает только значения, array_diff_assoc() проверяет и ключ, и значение — пара остаётся в результате только в том случае, если ни в одном другом массиве нет такого же ключа с таким же значением. Это делает её подходящим инструментом для поиска различий в ассоциативных массивах.
На этой странице рассматриваются синтаксис, принцип сопоставления ключа и значения, отличие от array_diff(), особенность нестрогого (строкового) сравнения и пример с несколькими массивами.
Синтаксис
array_diff_assoc(array $array, array ...$arrays): array$array— массив, из которого берутся элементы для сравнения. Оставшиеся элементы образуют результат....$arrays— один или несколько массивов, с которыми выполняется сравнение.
Функция возвращает новый массив, содержащий все пары ключ/значение из $array, которые не встречаются (с тем же ключом) ни в одном из остальных массивов. Ключи в результате сохраняются.
Принцип работы
array_diff_assoc() перебирает первый массив и для каждой пары проверяет: есть ли в каком-либо другом массиве тот же ключ с тем же значением? Если да — пара исключается; если нет — остаётся.
Пример PHP array_diff_assoc()
Вывод:
Array
(
[b] => banana
)В результате остаётся только "b" => "banana": в $array2 ключа b вовсе нет. Пары a и c совпадают и по ключу, и по значению, поэтому они исключаются. Обратите внимание, что "d" => "date" в $array2 не имеет значения — в результате могут присутствовать только элементы из первого массива.
array_diff_assoc() против array_diff()
Ключевое различие состоит в том, участвуют ли ключи в сравнении. Одинаковое значение под разными ключами array_diff() считает равным, а array_diff_assoc() — нет:
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("x" => "apple");
print_r(array_diff_assoc($a, $b)); // compares key AND value
print_r(array_diff($a, $b)); // compares value only
?>Вывод:
Array
(
[a] => apple
[b] => banana
)
Array
(
[b] => banana
)array_diff_assoc() оставляет "a" => "apple", потому что в $b значение apple хранится под ключом x, а не a. array_diff() удаляет его, поскольку значение apple где-то в $b присутствует.
Особенность: сравнение выполняется как строк
Внутри array_diff_assoc() сравнивает значения нестрого, приводя их к строкам — (string) $elem1 === (string) $elem2. Это означает, что 10 (int) и "10" (string) считаются равными:
<?php
$a = array("x" => 10);
$b = array("x" => "10");
print_r(array_diff_assoc($a, $b));
?>Вывод:
Array
(
)Результат пустой: 10 и "10" при преобразовании к строке дают одинаковое "10". Если нужно строгое сравнение с учётом типов, используйте функцию с колбэком array_udiff_assoc() (или сравнивайте типы самостоятельно). Для сравнения только по ключам используйте array_diff_key().
Сравнение более двух массивов
Можно передать любое количество массивов. Элемент остаётся в результате только в том случае, если он отсутствует во всех переданных массивах. Это работает и с числовыми ключами:
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
print_r(array_diff_assoc($array1, $array2));
?>Вывод:
Array
(
[b] => brown
[c] => blue
[0] => red
)"a" => "green" совпадает и удаляется. [0] => "red" остаётся, потому что в $array2 значение "red" находится под ключом 1, а не 0 — то есть пара ключ/значение отличается.
Когда использовать
- Сравнение двух конфигурационных или настроечных массивов, где важен ключ (например, для нахождения изменённых параметров).
- Поиск элементов, удалённых из снимка состояния «до», когда важны и ключ, и значение.
- Любое сравнение, при котором сопоставление только по значению (
array_diff()) давало бы ложные совпадения.
Связанные функции
array_diff()— сравнивает только по значению.array_diff_key()— сравнивает только по ключу.array_intersect_assoc()— обратная функция: оставляет элементы, присутствующие во всех массивах по ключу и значению.