W3docs

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

Узнайте, как использовать PHP array_uintersect_uassoc для вычисления пересечения массивов с пользовательскими callback-функциями сравнения значений и ключей.

PHP — мощный язык с богатым набором функций, и array_uintersect_uassoc является одной из наиболее гибких функций в библиотеке PHP для работы с array. Эта функция позволяет вычислять пересечение массивов с использованием пользовательских функций сравнения ключей.

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

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

Что такое функция array_uintersect_uassoc?

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

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

Как использовать функцию array_uintersect_uassoc

Функция array_uintersect_uassoc принимает два или более массивов, после которых следуют два callback-аргумента — последний аргумент всегда является callback-функцией сравнения ключей, а предпоследний — callback-функцией сравнения значений. Вот синтаксис:

Синтаксис функции PHP array_uintersect_uassoc

array_uintersect_uassoc(
    array $array1,
    array $array2,
    array ...$arrays,
    callable $value_compare_func,
    callable $key_compare_func
): array

Параметры:

  • array1: Базовый array. Значения, прошедшие сравнение, берутся отсюда с сохранением оригинальных ключей.
  • array2, ...$arrays: Один или несколько массивов для сравнения с array1.
  • value_compare_func: Callback-функция для сравнения значений. Принимает два значения и должна возвращать целое число меньше, равное или больше 0 — точно как компаратор сортировки. Возврат 0 означает «равны».
  • key_compare_func: Callback-функция для сравнения ключей с тем же трёхзначным контрактом возврата.

Возвращаемое значение: Возвращает array, содержащий каждый элемент array1, у которого значение и ключ одновременно совпадают с элементом в каждом из остальных массивов. Элемент сохраняется только тогда, когда обе callback-функции возвращают 0 для некоторого элемента в каждом другом array.

Поскольку обе callback-функции следуют стандартному контракту <=> (оператор spaceship), возврат 1 или -1 просто сообщает PHP, что элементы не равны — только 0 считается совпадением.

Рассмотрим пример использования функции array_uintersect_uassoc для сравнения двух массивов:

PHP: использование функции array_uintersect_uassoc для сравнения двух массивов

<?php

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

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

$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "d" => "red"];
$array2 = ["a" => "green", "b" => "yellow", "blue", "d" => "red"];

$result = array_uintersect_uassoc($array1, $array2, "compare_data", "compare_keys");
print_r($result);

?>

В приведённом выше примере сначала определяются две пользовательские функции сравнения данных и ключей, затем определяются два массива для сравнения. После этого вызывается функция array_uintersect_uassoc с двумя массивами и двумя функциями сравнения в качестве аргументов.

Функция array_uintersect_uassoc возвращает array, содержащий значения, присутствующие в обоих массивах. В данном примере результат будет следующим:

Array
(
    [a] => green
    [d] => red
)

Почему только a и d? Элемент сохраняется только тогда, когда и его ключ, и его значение совпадают.

  • [a] => green совпадает: ключ a и значение green присутствуют в обоих массивах. Сохранён.
  • [b] => brown удалён: ключ b есть в обоих, но значения (brown и yellow) различаются.
  • [c] => blue удалён: в array1 элемент хранится под ключом c, но в array2 blue хранится под автоматически присвоенным числовым ключом 0, поэтому ключи не совпадают.
  • [d] => red совпадает: ключ d и значение red есть в обоих. Сохранён.

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

Примечание: В примере используются именованные функции для широкой совместимости, однако современный PHP (7.4+) поддерживает краткие стрелочные функции (например, fn($a, $b) => $a <=> $b). Выбирайте синтаксис, соответствующий требованиям к версии PHP в вашем проекте.

Когда использовать эту функцию

Используйте array_uintersect_uassoc, когда выполняются все три условия: нужно пересечение, ключи значимы (ассоциативные данные), и для значений или ключей требуется пользовательская логика сравнения (строки без учёта регистра, объекты, сортировка с учётом локали, допуски для чисел с плавающей точкой и т.д.). Если необходимо только одно из них, подойдёт более простой аналог:

  • array_intersect — только значения, встроенное сравнение.
  • array_intersect_assoc — ключ и значение, встроенное сравнение.
  • array_uintersect — только значения, пользовательский callback для значений.
  • array_uintersect_assoc — пользовательский callback для значений, встроенное сравнение ключей.
  • array_intersect_uassoc — встроенное сравнение значений, пользовательский callback для ключей.

Общий обзор работы с массивами приведён в главе PHP Arrays.

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

В первом примере использовались строгие компараторы, поэтому он ведёт себя как встроенная функция array_intersect_assoc. Настоящая мощь проявляется, когда callback-функции делают то, чего встроенные функции не могут, — например, сопоставляют ключи и значения независимо от регистра:

<?php

$inventory = ["Apple" => "RED", "Banana" => "yellow", "Cherry" => "dark-red"];
$catalog   = ["apple" => "red", "banana" => "GREEN", "cherry" => "DARK-RED"];

$result = array_uintersect_uassoc(
    $inventory,
    $catalog,
    fn($a, $b) => strcasecmp($a, $b), // compare values, ignoring case
    fn($a, $b) => strcasecmp($a, $b)  // compare keys, ignoring case
);

print_r($result);

?>

strcasecmp возвращает 0, когда две строки равны без учёта регистра, что идеально вписывается в контракт компаратора. Результат содержит элементы из $inventory, чьи ключ и значение совпадают с $catalog без учёта регистра:

Array
(
    [Apple] => RED
    [Cherry] => dark-red
)

Banana исключён, потому что, несмотря на совпадение ключей, значения (yellow и GREEN) различаются даже без учёта регистра. Обычная функция array_intersect_assoc не нашла бы ни одного совпадения, поскольку её встроенное сравнение чувствительно к регистру.

Преимущества использования функции array_uintersect_uassoc

Использование функции array_uintersect_uassoc в PHP-проектах имеет ряд преимуществ. Вот основные из них:

1. Точное сопоставление по ключу и значению

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

2. Пользовательская логика сравнения

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

3. Производительность на уровне ядра

Реализованная на C в ядре PHP, функция эффективно выполняется для стандартных операций с массивами без внешних зависимостей, что делает её подходящей для наборов данных умеренного размера.

Советы по использованию функции array_uintersect_uassoc

Вот несколько советов по использованию функции array_uintersect_uassoc в PHP-проектах:

1. Определяйте пользовательские функции сравнения

Чтобы максимально эффективно использовать array_uintersect_uassoc, необходимо определять пользовательские функции сравнения. Это позволит настроить логику сравнения под конкретные нужды проекта.

2. Используйте типобезопасное сравнение

При определении пользовательских функций сравнения важно использовать типобезопасные операторы. Это обеспечит сравнение данных правильных типов и повысит точность результатов.

3. Тестируйте функции сравнения

Перед использованием пользовательских функций сравнения в production-среде важно тщательно их протестировать. Это поможет выявить ошибки и убедиться, что логика сравнения работает корректно.

Заключение

В этой статье мы рассмотрели функцию array_uintersect_uassoc в PHP. Это мощный инструмент для сравнения массивов и поиска значений, присутствующих во всех из них. Используя пользовательские функции сравнения данных и ключей, вы можете настраивать логику сравнения под конкретные нужды проекта.

Если вы хотите вывести свои навыки PHP на новый уровень, освоение функции array_uintersect_uassoc — отличное начало. Благодаря своей гибкости и универсальности эта функция является незаменимым инструментом для любого PHP-разработчика.

Спасибо, что прочитали наше руководство по функции array_uintersect_uassoc. Надеемся, вы нашли его полезным и информативным. Если у вас есть вопросы или отзывы, пожалуйста, свяжитесь с нами.

Практика

Практика
Какова цель функции array_uintersect_uassoc в PHP?
Какова цель функции array_uintersect_uassoc в PHP?
Was this page helpful?