Функция array_intersect_uassoc() в PHP с пользовательским callback
Узнайте, как работает array_intersect_uassoc() в PHP: пересечение массивов с пользовательским сравнением ключей и примеры использования.
array_intersect_uassoc() вычисляет пересечение двух и более массивов — она возвращает элементы первого array, чьи значение И ключ присутствуют во всех остальных массивах. Особенность этого варианта отражена в букве u в названии: вы передаёте пользовательский callback, который определяет, считаются ли два ключа равными. Значения по-прежнему сравниваются встроенным PHP-сравнением (нестрогим, с приведением к string).
На этой странице объясняется принцип работы функции, разбирается проверенный пример и показывается, когда лучше использовать её, а не другие варианты array_intersect_*.
Синтаксис
array_intersect_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— array для сравнения; его элементы попадают в результат....$arrays— один или несколько массивов для сравнения с первым.$key_compare_func— callback для сравнения двух ключей. Он должен возвращать целое число меньше, равное или больше0, если первый ключ считается меньше, равным или больше второго (тот же контракт, что у компаратораusort).
Функция возвращает новый array с совпавшими элементами из $array, сохраняя их исходные ключи.
Как работает callback для ключей
В отличие от array_intersect_assoc(), которая сравнивает ключи через ===, эта функция делегирует сравнение ключей вашему callback. Это позволяет реализовать правила сопоставления, которых нет в PHP из коробки, — регистронезависимые ключи, ключи без пробелов или сортировку с учётом локали.
Обратите внимание на разделение ответственности: ключи сравниваются вашим callback, а значения по-прежнему сравниваются самой функцией (нестрого, как строки). Если вам также нужно пользовательское сравнение значений, используйте array_uintersect_uassoc().
Пример
<?php
// The callback receives two keys and must return an int:
// 0 = equal, -1 = first is smaller, 1 = first is larger.
function compareKeys($key1, $key2) {
if ($key1 === $key2) {
return 0;
}
return ($key1 > $key2) ? 1 : -1;
}
$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["a" => "green", "yellow", "red"];
$result = array_intersect_uassoc($array1, $array2, "compareKeys");
print_r($result);
?>Вывод:
Array
(
[a] => green
)Выживает только "a" => "green", потому что это единственный элемент, чей ключ и значение присутствуют в $array2:
"b" => "brown"и"c" => "blue"— таких ключей нет в$array2.0 => "red"в$array1— значение"red"есть в$array2, но под ключом1, поэтому ключи (0и1) не совпадают.
Когда использовать
Используйте array_intersect_uassoc(), когда нужно пересечение с учётом ключей и ключи требуют нестандартной логики сопоставления. Типичный случай — регистронезависимое сопоставление заголовков или столбцов:
<?php
function ci_keys($k1, $k2) {
return strcasecmp((string) $k1, (string) $k2);
}
$config = ["Host" => "localhost", "Port" => 8080];
$expected = ["host" => "localhost", "PORT" => 8080];
print_r(array_intersect_uassoc($config, $expected, "ci_keys"));
?>Это сохраняет Host => localhost и Port => 8080, поскольку callback считает Host/host и Port/PORT одинаковыми ключами, а значения при этом совпадают.
Связанные функции
| Функция | Сравнение ключей | Сравнение значений |
|---|---|---|
array_intersect() | игнорируется | встроенное |
array_intersect_assoc() | === | встроенное |
array_intersect_key() | === (только ключи) | игнорируется |
array_intersect_ukey() | callback (только ключи) | игнорируется |
array_intersect_uassoc() | callback | встроенное |
array_uintersect_uassoc() | callback | callback |
Заключение
array_intersect_uassoc() возвращает элементы первого array, чьи значение и ключ присутствуют во всех остальных массивах, позволяя управлять сопоставлением ключей через пользовательский callback. Используйте её, когда ассоциативное пересечение требует гибких правил для ключей — например, регистронезависимых или без лишних пробелов — и помните, что значения по-прежнему сравниваются встроенным PHP-сравнением.