W3docs

Функция PHP array_diff_key — подробное руководство

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

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

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

Синтаксис

array_diff_key(array $array, array ...$arrays): array
  • $array — массив для сравнения (результат содержит только его элементы).
  • ...$arrays — один или несколько массивов, чьи ключи используются для исключения элементов из $array.
  • Возвращает новый массив. Каждый элемент $array сохраняется только в том случае, если его ключ отсутствует во всех остальных массивах. Ключи и значения сохраняются точно так же, как в $array.

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

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

Вот практический пример — сравнение полного прайс-листа с товарами, у которых уже есть скидка, чтобы найти товары, которым скидка ещё нужна:

Пример PHP с использованием array_diff_key

<?php

$prices = [
    "apple"  => 1.20,
    "banana" => 0.50,
    "cherry" => 3.00,
    "date"   => 2.10,
];

// Items that already have a discounted price.
$discounted = ["banana" => 0.40, "date" => 1.90];

// Keep only the items NOT present in $discounted (compared by key).
$result = array_diff_key($prices, $discounted);

print_r($result);

?>

В результате остаются apple и cherry, потому что их ключи отсутствуют в $discounted. Обратите внимание, что banana и date удаляются даже несмотря на то, что их значения различаются в двух массивахarray_diff_key() полностью игнорирует значения:

Array
(
    [apple] => 1.2
    [cherry] => 3
)

Сравнение более двух массивов

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

<?php

$a = ["color" => "red", "size" => "M", "qty" => 5];
$b = ["color" => "blue"];
$c = ["qty" => 99];

print_r(array_diff_key($a, $b, $c));

?>

Остаётся только size, потому что color совпадает с ключом из $b, а qty — из $c:

Array
(
    [size] => M
)

Ключи сравниваются как строки

PHP приводит все ключи к строкам перед сравнением, поэтому целочисленный ключ 0 и строковый ключ "0" считаются одинаковыми. Это важно при смешивании числовых и строковых ключей:

<?php

$nums   = [0 => "a", 1 => "b", 2 => "c"];
$remove = ["0" => "x", "2" => "y"];

print_r(array_diff_key($nums, $remove));

?>
Array
(
    [1] => b
)

Сценарии использования array_diff_key

  • Белые/чёрные списки полей. Удалите нежелательные ключи из пользовательского ввода: array_diff_key($input, array_flip(['password', 'token'])) удаляет эти два ключа независимо от их значений.
  • Поиск отсутствующей конфигурации. Сравните набор значений по умолчанию с конфигурацией, предоставленной пользователем, чтобы выявить пропущенные ключи.
  • Сверка наборов данных. Выявите записи (с ключами по ID), которые существуют в одном массиве, но отсутствуют в другом.
  • Очистка данных запроса перед передачей в функцию, которая отклоняет неожиданные ключи.

Совет: Если вместо этого нужно сохранить только элементы, чьи ключи присутствуют в другом массиве, используйте array_intersect_key() — это зеркальное отражение array_diff_key().

array_diff_key и связанные функции

ФункцияСравнивает поУчитываются ли значения?
array_diff_key()только ключамнет
array_diff()только значениямда
array_diff_assoc()ключам и значениямда
array_diff_ukey()ключам через callbackнет

Если нужна дополнительная проверка значений помимо сравнения ключей, используйте array_diff_assoc(). Чтобы настроить способ сравнения ключей (например, сравнение без учёта регистра), используйте array_diff_ukey().

Заключение

array_diff_key() — это сфокусированный и быстрый способ отфильтровать один массив по ключам других. Запомните два правила, которые чаще всего вызывают путаницу: функция сравнивает только ключи (значения игнорируются), а ключи приводятся к строкам перед сравнением. Для сравнений с учётом значений используйте array_diff_assoc(), а для проверки одного ключа — array_key_exists().

Практика

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