Array diff key: примеры (PHP)

Использование array_diff_key для сравнения массивов по ключам
Раздел: Работа с массивами
array_diff_key(array $array, array ...$arrays): array
Описание функции array_diff_key

Функция array_diff_key() сравнивает ключи двух или более массивов и возвращает разницу между ними. Она используется для определения, какие ключи присутствуют в первом массиве, но отсутствуют во всех последующих массивах.

Когда применяется функция

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

Аргументы функции

Синтаксис: array_diff_key(array $array, array ...$arrays): array

  • $array – основной массив, с которым происходит сравнение.
  • ...$arrays – переменное количество массивов для сравнения с первым.

Функция не имеет флагов поведения.

Базовые примеры использования
Сравнение двух массивов
<?php
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['b' => 4, 'd' => 5];
$result = array_diff_key($array1, $array2);
print_r($result);
?>
Array
(
    [a] => 1
    [c] => 3
)
Сравнение нескольких массивов
<?php
$array1 = ['red' => 'apple', 'blue' => 'sky', 'green' => 'grass'];
$array2 = ['blue' => 'sea', 'yellow' => 'sun'];
$array3 = ['green' => 'tree', 'black' => 'night'];
$result = array_diff_key($array1, $array2, $array3);
print_r($result);
?>
Array
(
    [red] => apple
)
Сравнение с числовыми ключами
<?php
$array1 = [10 => 'десять', 20 => 'двадцать', 30 => 'тридцать'];
$array2 = [20 => 'двадцать', 40 => 'сорок'];
$result = array_diff_key($array1, $array2);
print_r($result);
?>
Array
(
    [10] => десять
    [30] => тридцать
)
Похожие функции в PHP

Сравнивает значения массивов и возвращает разницу. Используется, когда важны значения, а не ключи.

Сравнивает и ключи, и значения. Полезен, когда необходимо учесть и ключ, и соответствующее ему значение.

array_intersect_key

Возвращает массив, содержащий ключи, присутствующие во всех сравниваемых массивах. Является противоположностью array_diff_key.

Когда что использовать: array_diff_key применяется для фильтрации по ключам, array_diff – по значениям, array_diff_assoc – по паре ключ-значение.

Типичные ошибки
Использование не массива в качестве аргумента
<?php
$array1 = ['a' => 1];
$result = array_diff_key($array1, null);
?>

Вызовет ошибку TypeError в PHP 8, так как аргумент должен быть массивом. В PHP 7 это приводило к предупреждению.

Непонимание работы с числовыми и строковыми ключами
<?php
$array1 = ['1' => 'один', 2 => 'два'];
$array2 = [1 => 'единица'];
$result = array_diff_key($array1, $array2);
print_r($result);
?>
Array
(
    [2] => два
)

Ключ '1' (строка) и 1 (целое число) считаются одинаковыми, так как PHP приводит строковый числовой ключ к целому числу.

Изменения в PHP 8

В PHP 8 функция array_diff_key() не претерпела значительных изменений по сравнению с PHP 7. Основное отличие – более строгая типизация: аргументы, не являющиеся массивами, вызывают TypeError. В PHP 7 такие аргументы приводились к массивам с выдачей предупреждения.

Расширенные примеры
Фильтрация конфигурационных данных
Пример php
<?php
// Исходная конфигурация со всеми параметрами
$config = [
    'host' => 'localhost',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'debug' => true
];
// Параметры, которые не следует передавать в публичный API
$sensitiveKeys = ['password', 'debug'];
$publicConfig = array_diff_key($config, array_flip($sensitiveKeys));
print_r($publicConfig);
?>
Array
(
    [host] => localhost
    [port] => 3306
    [user] => root
)
Сравнение с динамическим списком массивов
Пример php
<?php
$baseArray = ['id' => 1, 'name' => 'Иван', 'age' => 30, 'city' => 'Москва'];
$arraysToCompare = [
    ['name' => 'Петр', 'city' => 'Санкт-Петербург'],
    ['age' => 25, 'country' => 'Россия'],
    ['id' => 10]
];
// Использование оператора распаковки
$result = array_diff_key($baseArray, ...$arraysToCompare);
print_r($result);
?>
Array
(
    [name] => Иван
    [age] => 30
    [city] => Москва
)
Работа с многомерными массивами
Пример php
<?php
// Сравнение ключей первого уровня многомерных массивов
$array1 = [
    'db' => ['host' => 'localhost'],
    'cache' => ['driver' => 'redis'],
    'log' => ['level' => 'debug']
];
$array2 = [
    'cache' => ['driver' => 'memcached'],
    'api' => ['key' => 'secret']
];
$result = array_diff_key($array1, $array2);
print_r($result);
?>
Array
(
    [db] => Array
        (
            [host] => localhost
        )
    [log] => Array
        (
            [level] => debug
        )
)
Комбинирование с array_flip для сравнения значений
Пример php
<?php
// Поиск уникальных значений через сравнение ключей перевернутых массивов
$array1 = ['яблоко', 'апельсин', 'банан'];
$array2 = ['апельсин', 'груша', 'яблоко'];
// Переворачиваем массивы, чтобы значения стали ключами
$resultValues = array_diff_key(array_flip($array1), array_flip($array2));
// Возвращаем ключи обратно в значения
$result = array_keys($resultValues);
print_r($result);
?>
Array
(
    [0] => банан
)
Аналоги в других языках

Array diff key в Python

Прямого аналога нет, но можно использовать операции со множествами (set) для ключей словаря.

dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 4, 'd': 5}
keys1 = set(dict1.keys())
keys2 = set(dict2.keys())
result_keys = keys1 - keys2
result = {k: dict1[k] for k in result_keys}
print(result)
{'a': 1, 'c': 3}

Array diff key в Javascript

Можно реализовать с помощью методов Object.keys и filter.

const array1 = { a: 1, b: 2, c: 3 };
const array2 = { b: 4, d: 5 };
const result = {};
Object.keys(array1)
  .filter(key => !(key in array2))
  .forEach(key => result[key] = array1[key]);
console.log(result);
{ a: 1, c: 3 }

Array diff key в MySQL

Прямого аналога нет, так как SQL работает с таблицами, а не с ассоциативными массивами. Для фильтрации полей используется оператор SELECT с явным перечислением столбцов.

PHP array_diff_key function comments

En
Array diff key Computes the difference of arrays using keys for comparison