W3docs

Функция array_diff_ukey() в PHP — Подробное руководство

Узнайте, как использовать функцию array_diff_ukey() в PHP для сравнения массивов по ключам с пользовательской функцией сравнения.

Функция PHP array_diff_ukey() — Подробное руководство

В PHP функция array_diff_ukey() — это мощный инструмент, который позволяет сравнивать массивы и возвращать разницу между ними на основе пользовательской функции сравнения ключей. В этой статье мы подробно рассмотрим, как работает эта функция и как её можно применять в PHP-проектах.

Сигнатура функции и параметры

array_diff_ukey(array $array, array ...$arrays, callable $key_compare_func): array

Это нотация функции из руководства PHP. Во время выполнения последний переданный аргумент всегда является функцией обратного вызова для сравнения; все предшествующие ему аргументы считаются массивами.

Параметры:

  • $array: Базовый array для сравнения.
  • $arrays: Один или несколько массивов для сравнения с базовым array.
  • $key_compare_func: Callable-функция, которая сравнивает два ключа и возвращает целое число меньше, равное или больше нуля (такой же контракт, как у компаратора usort).

Возвращает: Array, содержащий элементы из $array, ключи которых отсутствуют в каком-либо из остальных массивов. Значения никогда не проверяются — только ключи.

Когда это использовать?

В большинстве случаев достаточно array_diff_key(): она удаляет элементы, чьи ключи присутствуют в других массивах, используя стандартное сравнение ключей в стиле ===. Обращайтесь к array_diff_ukey() только тогда, когда вопрос «является ли этот ключ тем же?» требует пользовательской логики — например, для сравнения ключей без учёта регистра, сравнения только префикса ключа или нормализации числовых строк перед сопоставлением. Если вместо этого нужно сравнивать значения с помощью функции обратного вызова, см. array_udiff(); для сравнения и ключей, и значений — array_diff_uassoc().

Как работает функция PHP array_diff_ukey()?

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

Если результат сравнения меньше нуля, первый аргумент считается меньше второго. Если результат больше нуля, первый аргумент считается больше второго. Если результат равен нулю, два аргумента считаются равными.

Использование функции PHP array_diff_ukey()

Вот пример использования функции array_diff_ukey() в PHP:

PHP-пример использования функции array_diff_ukey

<?php

function key_compare_func($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b)? 1:-1;
}

$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["a" => "green", "yellow", "red"];
$result = array_diff_ukey($array1, $array2, 'key_compare_func');
print_r($result);

?>

В этом примере функция array_diff_ukey() используется для сравнения элементов $array1 и $array2 с помощью пользовательской функции сравнения ключей key_compare_func. Результирующий array, сохранённый в $result, содержит элементы из $array1, которые отсутствуют в $array2.

Примечание: в функции обратного вызова $a и $b представляют ключи массивов, а не значения.

Вывод:

Array
(
    [b] => brown
    [c] => blue
)

Разберём детально: $array1 имеет ключи a, b, c и 0 (элемент "red" без явного ключа получает целочисленный ключ 0). $array2 имеет ключи a, 0 и 1. Ключи a и 0 присутствуют в обоих массивах, поэтому array_diff_ukey() исключает "green" и "red" из результата, оставляя только элементы с ключами (b, c), уникальными для $array1.

Пользовательская функция сравнения ключей

Пользовательская функция сравнения ключей является ключевой частью функции array_diff_ukey(), поскольку именно она определяет, как сравниваются элементы двух массивов. Вот пример пользовательской функции сравнения ключей:

PHP-пример пользовательской функции сравнения ключей array

function key_compare_func($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b)? 1:-1;
}

В этом примере функция key_compare_func() возвращает 0, если оба аргумента равны, 1, если первый аргумент больше второго, и -1, если первый аргумент меньше второго.

Замечание о преобразовании типов: при сравнении ключей смешанных типов (например, string и integer) нестрогое сравнение в вашей функции обратного вызова может привести к неожиданным результатам. Убедитесь, что ваша функция явно обрабатывает приведение типов или использует строгое сравнение (===), если требуется точное совпадение типов.

Практический пример: сравнение ключей без учёта регистра

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

php— editable, runs on the server

Несмотря на то что "Host" и "PORT" отличаются по регистру от "host" и "port", функция strcasecmp считает их одинаковыми ключами, поэтому они исключаются. Выживает только Debug, у которого нет аналога в $defaults:

Array
(
    [Debug] => 1
)

Обычная array_diff_key() сохранила бы все три элемента, поскольку "Host" !== "host". Именно это различие и определяет, когда array_diff_ukey() является правильным инструментом.

Заключение

Функция array_diff_ukey() сравнивает массивы по их ключам с помощью предоставленной вами функции обратного вызова, возвращая элементы из первого массива, чьи ключи отсутствуют в остальных. Используйте её, когда для определения равенства ключей необходима пользовательская логика; для строгого сравнения ключей достаточно array_diff_key().

Смежные функции, которые стоит знать:

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

Практика

Практика
Что представляет собой корректное использование функции array_diff_ukey() в PHP?
Что представляет собой корректное использование функции array_diff_ukey() в PHP?
Was this page helpful?