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