Подробное руководство по функции 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_func | Callback-функция, которая определяет равенство двух значений. Всегда является последним аргументом. |
Функция возвращает новый массив значений из $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().
Ключевые преимущества:
- Нахождение общих элементов среди множества массивов в одном вызове без ручных циклов.
- Оригинальные ключи из первого массива сохраняются для упрощения маппинга данных.
- Пользовательская логика сравнения позволяет работать со сложными типами данных и специфическими правилами сопоставления.
Заключение
array_uintersect() — правильный выбор, когда нужно найти общие значения нескольких массивов, но встроенное сравнение PHP не соответствует тому, как вы определяете равенство. Определите callback, возвращающий 0 для равных значений, передайте его последним аргументом — и функция вернёт совпадающие значения из первого массива с сохранением их ключей.