Array diff key: примеры (PHP)
array_diff_key(array $array, array ...$arrays): arrayФункция 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] => тридцать
)Сравнивает значения массивов и возвращает разницу. Используется, когда важны значения, а не ключи.
Сравнивает и ключи, и значения. Полезен, когда необходимо учесть и ключ, и соответствующее ему значение.
Возвращает массив, содержащий ключи, присутствующие во всех сравниваемых массивах. Является противоположностью 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 функция array_diff_key() не претерпела значительных изменений по сравнению с PHP 7. Основное отличие – более строгая типизация: аргументы, не являющиеся массивами, вызывают TypeError. В PHP 7 такие аргументы приводились к массивам с выдачей предупреждения.
<?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
$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
// Сравнение ключей первого уровня многомерных массивов
$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
)
)
<?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 с явным перечислением столбцов.