W3docs

Функция 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()callbackcallback

Заключение

array_intersect_uassoc() возвращает элементы первого array, чьи значение и ключ присутствуют во всех остальных массивах, позволяя управлять сопоставлением ключей через пользовательский callback. Используйте её, когда ассоциативное пересечение требует гибких правил для ключей — например, регистронезависимых или без лишних пробелов — и помните, что значения по-прежнему сравниваются встроенным PHP-сравнением.

Практика

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