W3docs

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":

php— editable, runs on the server

Нестрогое и строгое сравнение

По умолчанию 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() при проверке ключей.

Практика

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