Функции типа 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!
