W3docs

Полное руководство по функции 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): array

Callback всегда является последним аргументом. Всё, что стоит перед ним, — это массивы для пересечения.

Параметры

ПараметрОписание
$array1Базовый массив. Ключи и значения из этого массива сохраняются в результате.
$array2, ...Один или несколько массивов для сравнения с $array1.
$value_compare_funcCallback-функция, которая сравнивает два значения и возвращает целое число.

Возвращаемое значение

Ассоциативный массив, содержащий каждый элемент $array1, чей ключ присутствует во всех остальных массивах и чьё значение callback считает равным во всех из них. Ключи сохраняются из $array1.

Функция callback

Callback принимает два значения и должен вернуть целое число, определяющее их порядок, — точно так же, как функции сравнения, используемые в usort():

  • 0, когда два значения считаются равными,
  • отрицательное число (< 0), когда первое «меньше» второго,
  • положительное число (> 0), когда первое «больше» второго.

Два значения считаются совпадающими только тогда, когда callback возвращает 0. Встроенные функции, такие как strcasecmp() (сравнение строк без учёта регистра) и strcmp(), уже следуют этому соглашению, поэтому их можно передавать напрямую.

Примеры

Пример 1: Базовое пересечение трёх массивов

php— editable, runs on the server

Вывод:

Array
(
    [c] => cherry
)

Только c => cherry проходит фильтр. apple есть в $array1 и $array3, но отсутствует в $array2; banana есть в $array1 и $array2, но отсутствует в $array3. Только cherry присутствует под одним ключом c во всех трёх массивах, поэтому это единственное совпадение. Обратите внимание, что ключ c сохраняется из $array1.

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

php— editable, runs on the server

Вывод:

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().

Практика

Практика
Что делает функция array_uintersect_assoc() в PHP?
Что делает функция array_uintersect_assoc() в PHP?
Was this page helpful?