Полное руководство по функции PHP array_uintersect_assoc
Узнайте, как PHP array_uintersect_assoc() вычисляет пересечение массивов с проверкой индексов и пользовательской функцией сравнения значений.
array_uintersect_assoc() вычисляет пересечение двух или более массивов с дополнительной проверкой индексов, где значения сравниваются с помощью переданного вами callback-а, а ключи сравниваются встроенным (нестрогим) способом. Функция возвращает элементы первого массива, чей ключ и значение также присутствуют в каждом из остальных массивов.
Буква «u» в названии означает пользовательское сравнение значений (user-defined); суффикс _assoc означает ключи тоже проверяются. Таким образом, элемент проходит фильтрацию только при выполнении обоих условий:
- его ключ существует во всех остальных массивах (сравнивается по стандартным правилам PHP), и
- ваш callback сообщает, что его значение равно соответствующему элементу в каждом из остальных массивов.
Это делает функцию строгим аналогом array_intersect(), которая игнорирует ключи и использует строковое сравнение. Используйте array_uintersect_assoc(), когда важно совпадение ключей и при этом нужна пользовательская логика сравнения значений — например, сравнение без учёта регистра, сравнение объектов или сравнение чисел с допуском.
Синтаксис
array_uintersect_assoc(array $array1, array $array2, ...$arrays, callable $value_compare_func): arrayCallback всегда является последним аргументом. Всё, что стоит перед ним, — это массивы для пересечения.
Параметры
| Параметр | Описание |
|---|---|
$array1 | Базовый массив. Ключи и значения из этого массива сохраняются в результате. |
$array2, ... | Один или несколько массивов для сравнения с $array1. |
$value_compare_func | Callback-функция, которая сравнивает два значения и возвращает целое число. |
Возвращаемое значение
Ассоциативный массив, содержащий каждый элемент $array1, чей ключ присутствует во всех остальных массивах и чьё значение callback считает равным во всех из них. Ключи сохраняются из $array1.
Функция callback
Callback принимает два значения и должен вернуть целое число, определяющее их порядок, — точно так же, как функции сравнения, используемые в usort():
0, когда два значения считаются равными,- отрицательное число (
< 0), когда первое «меньше» второго, - положительное число (
> 0), когда первое «больше» второго.
Два значения считаются совпадающими только тогда, когда callback возвращает 0. Встроенные функции, такие как strcasecmp() (сравнение строк без учёта регистра) и strcmp(), уже следуют этому соглашению, поэтому их можно передавать напрямую.
Примеры
Пример 1: Базовое пересечение трёх массивов
Вывод:
Array
(
[c] => cherry
)Только c => cherry проходит фильтр. apple есть в $array1 и $array3, но отсутствует в $array2; banana есть в $array1 и $array2, но отсутствует в $array3. Только cherry присутствует под одним ключом c во всех трёх массивах, поэтому это единственное совпадение. Обратите внимание, что ключ c сохраняется из $array1.
Пример 2: Сравнение значений без учёта регистра
Вывод:
Array
(
[c] => Cherry
)Значения различаются по регистру в разных массивах (Cherry и cherry), но поскольку strcasecmp сравнивает без учёта регистра, callback всё равно считает их равными. В результате значение сохраняется таким, каким оно записано в $array1 (Cherry).
Пример 3: Почему важна проверка индексов
Роль части «assoc» проще всего увидеть, когда одно и то же значение находится под разными ключами:
<?php
$array1 = array('x' => 'red', 'y' => 'green', 'z' => 'blue');
$array2 = array('x' => 'red', 'w' => 'green', 'z' => 'BLUE');
$result = array_uintersect_assoc($array1, $array2, "strcasecmp");
print_r($result);
?>Вывод:
Array
(
[x] => red
[z] => blue
)red совпадает, потому что в обоих массивах он стоит под ключом x. blue/BLUE совпадает, потому что они стоят под ключом z и strcasecmp игнорирует регистр. Но green отбрасывается: в первом массиве он стоит под ключом y, а во втором — под ключом w, поэтому ключи не совпадают. Если бы вы использовали обычный array_uintersect(), green был бы включён в результат, так как ключи там игнорируются.
Связанные функции
array_intersect()— пересечение только по значению с использованием строкового сравнения.array_intersect_assoc()— пересечение по ключу и значению с использованием строкового сравнения (без callback).array_uintersect()— пересечение по значению с callback-ом, без учёта ключей.array_uintersect_uassoc()— аналог данной функции, но ключи сравниваются с помощью второго callback-а.
Заключение
array_uintersect_assoc() сохраняет элементы первого массива, чей ключ присутствует в каждом из остальных массивов и чьё значение callback считает равным во всех них. Используйте её, когда ключи важны и для сравнения значений требуется пользовательская логика. Если вам также нужен контроль над сравнением ключей, воспользуйтесь array_uintersect_uassoc(); если достаточно строкового сравнения значений, подойдёт более простая array_intersect_assoc().