in_array()
Как PHP-функция in_array() проверяет наличие значения в массиве, чем отличается нестрогое и строгое сравнение и каких подводных камней избегать.
Что делает in_array()
in_array() проверяет, существует ли заданное значение где-либо в массиве, и возвращает boolean: true, если значение найдено, и false, если нет. Функция выполняет поиск по значениям массива (не по ключам), что делает её первым выбором для вопросов вида «разрешена ли эта опция?» или «уже ли добавлен этот пользователь в список?».
На этой странице рассматривается сигнатура функции, как нестрогое и строгое сравнение меняют результат, подводные камни приведения типов и ситуации, когда лучше использовать другую функцию.
Синтаксис
in_array(mixed $needle, array $haystack, bool $strict = false): bool| Параметр | Описание |
|---|---|
$needle | Искомое значение. |
$haystack | Массив, в котором выполняется поиск. |
$strict | Если true, типы также должны совпадать (используется === вместо ==). По умолчанию false. |
Функция возвращает true, если $needle найден в $haystack, иначе — false.
Базовый пример
<?php
$fruits = ["apple", "banana", "orange"];
if (in_array("banana", $fruits)) {
echo "Found!";
} else {
echo "Not found.";
}
// Output: Found!in_array() чувствительна к регистру для строк — "Apple" не совпадёт с "apple":
Нестрогое и строгое сравнение
По умолчанию in_array() использует нестрогое сравнение (==), поэтому значения разных типов могут совпадать. Передайте true третьим аргументом, чтобы требовать точного соответствия типов (===):
<?php
$numbers = [1, 2, 3, 4];
// Loose: the string "1" equals the integer 1
var_dump(in_array("1", $numbers)); // bool(true)
// Strict: "1" (string) is not identical to 1 (int)
var_dump(in_array("1", $numbers, true)); // bool(false)Используйте строгий режим, когда в вашем массиве перемешаны типы или когда совпадение с неверным типом является ошибкой — например, при проверке пользовательского ID в списке целочисленных ID.
Подводные камни приведения типов
Нестрогое сравнение может давать неожиданные результаты. Классический пример — поиск пустой строки или 0 в списке строк:
<?php
$values = [0, "", "foo", "bar"];
var_dump(in_array("0", $values)); // bool(true) — "0" == 0
var_dump(in_array("0", $values, true)); // bool(false) — different typesЗдесь "0" (строка) нестрого равна целому числу 0, уже находящемуся в массиве, поэтому нестрогий поиск возвращает true. Строгий режим устраняет эту неоднозначность.
Примечание: PHP 8 изменил способ сравнения строк и чисел. В PHP 7
in_array(0, ["foo", "bar"])возвращалtrue, так как"foo"приводилось к0. В PHP 8+ тот же вызов возвращаетfalse. При сомнениях передавайте$strict = true.
Получение позиции вместо true/false
in_array() только сообщает, существует ли значение. Если вам также нужен его ключ, используйте array_search() — она возвращает ключ при успехе и false при неудаче:
<?php
$fruits = ["apple", "banana", "orange"];
$key = array_search("banana", $fruits);
var_dump($key); // int(1)Чтобы проверить наличие конкретного ключа (а не значения), используйте array_key_exists() или isset().
Когда использовать другую функцию
- Нужна позиция совпавшего значения? →
array_search() - Проверяете ключ, а не значение? →
array_key_exists()илиisset() - Фильтруете массив по совпадающим элементам? →
array_filter() - Выполняете поиск в очень большом массиве многократно? Преобразуйте значения в ключи с помощью
array_keys()и используйтеisset()— это быстрее, чем сканирование сin_array().
Резюме
in_array($needle, $haystack)возвращаетtrue/falseв зависимости от того, существует ли значение в массиве.- Функция выполняет поиск по значениям, чувствительна к регистру для строк и по умолчанию использует нестрогое сравнение.
- Передайте
trueтретьим аргументом для строгого (типозависимого) сопоставления — предпочтительно, когда важны типы. - Используйте
array_search(), когда нужен ключ, иarray_key_exists()/isset()при проверке ключей.