in_array_assoc()
Glossary overview

in_array_assoc()

Функции типа in_array_assoc() в стандартной библиотеке PHP нет, потому что in_array() сравнивает только простые значения или точно совпадающие массивы, но не умеет сравнивать ассоциативные массивы “по ключам”.

Поэтому мы можем написать свою такую функцию — in_array_assoc() — которая будет искать, есть ли массив с определёнными ключами/значениями внутри массива массивов.

Задача: Найти массив по совпадению ключей и значений

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie'],
];

$search = ['id' => 2, 'name' => 'Bob'];

Если сделать просто:

in_array($search, $users); // true? ❌ Нет, работает не всегда корректно

Решение: in_array_assoc()

Вот как можно написать свою функцию:

function in_array_assoc(array $needle, array $haystack): bool {
    foreach ($haystack as $item) {
        if (is_array($item) && count(array_diff_assoc($needle, $item)) === 0) {
            return true;
        }
    }
    return false;
}

Как работает:

  • array_diff_assoc($needle, $item) возвращает разницу между двумя ассоциативными массивами (учитывая ключи и значения).
  • Если разницы нет — значит, массивы совпадают.

Пример использования:

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie'],
];

$search = ['id' => 2, 'name' => 'Bob'];

if (in_array_assoc($search, $users)) {
    echo "User found!";
} else {
    echo "User not found.";
}

// Вывод
User found!