W3docs

Подробное руководство по функции array_uintersect() в PHP

Узнайте, как array_uintersect() в PHP сравнивает массивы через callback и возвращает общие значения. Синтаксис, примеры и случаи применения.

Функция array_uintersect() сравнивает значения двух и более массивов и возвращает значения из первого массива, которые также присутствуют во всех остальных. Главное отличие от array_intersect() — префикс u: вы передаёте логику сравнения в виде callback-функции и сами определяете, когда два значения считаются равными.

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

Синтаксис

array_uintersect(
    array $array1,
    array $array2,
    array ...$arrays,
    callable $value_compare_func
): array
ПараметрОписание
$array1Базовый массив. Его ключи и значения сохраняются в результате.
$array2, ...$arraysОдин или несколько массивов для сравнения. Значение попадает в результат, только если оно присутствует во всех массивах.
$value_compare_funcCallback-функция, которая определяет равенство двух значений. Всегда является последним аргументом.

Функция возвращает новый массив значений из $array1, найденных во всех остальных массивах, с сохранением оригинальных ключей из $array1.

Как работает callback-функция сравнения

Callback получает два значения и должен возвращать целое число:

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

Только возвращаемое значение 0 считается совпадением. Это тот же трёхсторонний контракт, что используется в функциях сортировки, например usort(), поэтому встроенная функция strcmp() удобно подходит в качестве callback для строк.

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

Простой строковый callback выглядит следующим образом:

function compare_strings($string1, $string2) {
    return strcmp($string1, $string2);
}

Базовый пример

Здесь мы находим пересечение трёх массивов с названиями фруктов, используя приведённый выше callback:

<?php

function compare_strings($string1, $string2) {
    return strcmp($string1, $string2);
}

$array1 = array("apple", "orange", "banana");
$array2 = array("orange", "banana", "kiwi");
$array3 = array("banana", "kiwi", "grape");

$result = array_uintersect($array1, $array2, $array3, "compare_strings");

print_r($result);

?>

Вывод:

Array
(
    [2] => banana
)

Только "banana" присутствует во всех трёх массивах. Обратите внимание: ключ равен 2 — это исходный индекс в $array1, который сохраняется в результате. "orange" исключается, так как отсутствует в $array3.

Сопоставление без учёта регистра

Поскольку вся логика сравнения сосредоточена в callback-функции, замена на strcasecmp() позволяет игнорировать регистр букв при нахождении пересечения:

<?php

$a = ["Red", "GREEN", "Blue"];
$b = ["red", "green", "yellow"];

$result = array_uintersect($a, $b, "strcasecmp");

print_r($result);

?>

Вывод:

Array
(
    [0] => Red
    [1] => GREEN
)

"Red" и "GREEN" остаются в результате, так как strcasecmp() считает их равными "red" и "green". Возвращаются значения из первого массива, поэтому исходный регистр символов сохраняется.

Когда использовать array_uintersect()

Используйте эту функцию, когда:

  • Вам нужно пересечение значений массивов (не ключей), и
  • Простой проверки на равенство недостаточно — значения являются объектами, имеют смешанные типы или требуют нечёткого/нормализованного сопоставления.

Если достаточно сравнения значений с помощью встроенного нестрогого сравнения PHP, array_intersect() проще. Если важны и ключи, обратитесь к array_uintersect_assoc(), а для нахождения разницы (вместо пересечения) с callback-функцией используйте array_udiff().

Ключевые преимущества:

  1. Нахождение общих элементов среди множества массивов в одном вызове без ручных циклов.
  2. Оригинальные ключи из первого массива сохраняются для упрощения маппинга данных.
  3. Пользовательская логика сравнения позволяет работать со сложными типами данных и специфическими правилами сопоставления.

Заключение

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

Практика

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