W3docs

Функция 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()

php— editable, runs on the server

Вывод:

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() — обратная функция: оставляет элементы, присутствующие во всех массивах по ключу и значению.

Практика

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