Menu

PHP array_search(): найти ключ по значению

array_search($value, $array) возвращает ключ первого элемента, равного $value, или false, если такого нет. Поскольку ключ может быть 0, всегда проверяйте результат через !== false. Строгий поиск, все совпадения, поиск в многомерном массиве через array_column и поиск без учёта регистра.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

array_search($value, $array) возвращает ключ первого элемента, равного $value, или false, если подходящего элемента нет. Поскольку найденный ключ может быть 0, проверяйте результат через !== false, как в if (($key = array_search('pear', $fruits)) !== false).

Если нужен только ответ "да" или "нет", in_array() даёт его напрямую. array_search() нужна, когда важно знать, где находится значение, например чтобы изменить или удалить его.

Ловушка 0 и false

Самая частая ошибка с array_search(): значение стоит первым, его ключ 0, а if ($key) считает 0 ложью. Код говорит "не найдено" про значение, которое лежит прямо там. Сравнивайте через !== false, оно совпадает только с настоящим false.

У != false та же ошибка, что и у if ($key), потому что 0 == false даёт true. Различить их может только строгий оператор.

Строгий поиск

Как и in_array(), array_search() сравнивает через ==, если не передать true третьим аргументом. Нестрогий режим позволяет строке найти число, а null найти 0, и функция возвращает неожиданный ключ.

Все ключи с заданным значением

array_search() останавливается на первом совпадении. array_keys($array, $value) возвращает все подходящие ключи массивом; добавьте true для строгого сравнения. Пустой результат означает, что совпадений нет, так что путаницы 0 и false не возникает.

Поиск в многомерном массиве через array_column

array_search() не заглядывает во вложенные массивы. Для списка строк извлеките нужное поле через array_column(); позиции в этом списке совпадают с номерами строк, поэтому результат и есть индекс строки.

array_column() нумерует свой результат заново с 0, поэтому всё сходится, только когда строки пронумерованы 0, 1, 2 без пропусков. После unset() или array_filter() в нумерации появляются пропуски; сначала примените к строкам array_values() или используйте поиск по ключу из двух последних строк. Подробнее о форме с ключом индекса на странице array_column().

Поиск без учёта регистра

array_search() сравнивает строки точно. Чтобы не учитывать регистр, приведите обе стороны к нижнему. array_map() сохраняет ключи, поэтому полученный ключ это ключ в исходном массиве.

Найти и заменить или удалить

Обычно ищут, чтобы что-то сделать с найденным элементом. Получив ключ, присвойте по нему, чтобы изменить элемент, или вызовите unset(), чтобы удалить его, но всегда сначала проверяйте !== false: unset($arr[false]) молча удаляет элемент с ключом 0.

Часто задаваемые вопросы

Что возвращает array_search, если значение не найдено?

false. Если значение найдено, функция возвращает его ключ, а он может быть 0 или пустой строкой, поэтому проверяйте результат через !== false, а не через if ($key) или != false.

Почему проверка array_search не срабатывает для первого элемента?

У первого элемента индексного массива ключ 0, а 0 ложен. Поэтому if (array_search('a', ['a', 'b'])) уходит в ветку "не найдено". Пишите if (array_search('a', $arr) !== false).

Как найти все ключи для значения в PHP?

array_search() останавливается на первом совпадении. array_keys($array, $value, true) возвращает все ключи с подходящим значением в виде массива (пустого, если совпадений нет).

Как искать в многомерном массиве в PHP?

Извлеките поле в плоский список и ищите в нём: $i = array_search('ada@example.com', array_column($users, 'email'));, а затем читайте строку как $users[$i]. Это работает, когда строки пронумерованы 0, 1, 2; иначе используйте цикл foreach.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ