Проверка существования значения — PHP: Массивы
В работе с массивами есть одна распространенная ошибка — выход за границу массива. Она происходит, когда мы пытаемся извлечь элемент массива по несуществующему индексу:
$animals = ['cats', 'dogs', 'birds']; $animals[5]; // null
Разные языки реагируют на выход за границу совершенно по-разному:
- В Python возникает ошибка
- В JavaScript возвращается undefined
- В языке С код возвращает случайные данные из соседнего блока памяти, что может привести к катастрофе
Выход за границу в PHP
В PHP свой путь. С одной стороны такой вызов вернет null . С другой стороны, код выдаст Warning с примерно таким сообщением: Warning: Undefined array key 5. В общем случае, стоит всегда проверять доступность индекса и никогда не обращаться к массиву за его границами. Это безопасная стратегия, можете использовать ее в разных языках. Так вам будет проще адаптироваться к ним.
Проверять наличие индекса в массиве можно с помощью функции array_key_exists . Первым параметром она принимает индекс, а вторым — массив для поиска:
$ages = [3, 2]; if (array_key_exists(3, $ages)) print_r('yeah!'); > else print_r('no'); > // => no
Вместо array_key_exists() иногда используют функцию isset() . Она имеет ровно одно отличие в поведении. Если значение по индексу существует, но его значение равно null , то эти операции приведут к разному результату:
- isset() вернет false
- array_key_exists() вернет true
Операция isset() похожа на проверку наличия значения по индексу, но все же у нее другой смысл. Поэтому в большинстве случаев стоит выбирать array_key_exists() , потому что она больше подходит по смыслу:
$ages = [3, 2]; // Операция isset принимает на вход массив, потому что он используется с подставленным индексом if (isset($ages[3])) print_r('yeah!'); > else print_r('no'); > // => no
Оператор объединения с null
Начиная с седьмой версии, в PHP появился специальный оператор ?? — он используется в качестве синтаксического сахара к isset() . Он позволяет упростить проверку на существование в тех случаях, когда нам нужно значение по умолчанию:
$age = $ages[3] ?? 5; // Значение по умолчанию равно 5
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
array_key_exists
Функция array_key_exists() возвращает true , если в массиве присутствует указанный ключ key . Параметр key может быть любым значением, которое подходит для индекса массива.
Список параметров
Массив с проверяемыми ключами.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Замечание:
array_key_exists() ищет ключи только на первом уровне массива. Внутренние ключи в многомерных массивах найдены не будут.
Примеры
Пример #1 Пример использования array_key_exists()
$search_array = array( ‘first’ => 1 , ‘second’ => 4 );
if ( array_key_exists ( ‘first’ , $search_array )) echo «Массив содержит элемент ‘first’.» ;
>
?>?php
Пример #2 array_key_exists() и isset()
isset() не возвращает true для ключей массива, указывающих на null , а array_key_exists() возвращает.
$search_array = array( ‘first’ => null , ‘second’ => 4 );
?php
// возвращает false
isset( $search_array [ ‘first’ ]);
// возвращает true
array_key_exists ( ‘first’ , $search_array );
?>
Примечания
Замечание:
По причинам обратной совместимости, array_key_exists() возвращает true , если key является свойством объекта ( object ), переданным в качестве параметра array . Поведение устарело в PHP 7.4.0 и удалено в PHP 8.0.0.
Чтобы проверить, содержит ли объект какое-либо свойство, используйте функцию property_exists() .
Смотрите также
- isset() — Определяет, была ли установлена переменная значением, отличным от null
- array_keys() — Возвращает все или некоторое подмножество ключей массива
- in_array() — Проверяет, присутствует ли в массиве значение
- property_exists() — Проверяет, содержит ли объект или класс указанный атрибут
Функция in_array
Функция in_array проверяет наличие заданного элемента в массиве. Первым параметром она принимает что искать, а вторым — в каком массиве.
Синтаксис
in_array(что искать, в каком массиве);
Пример
Давайте проверим, есть ли в массиве $arr элемент со значением 3 :
Результат выполнения кода:
Смотрите также
- функцию array_key_exists ,
которая проверяет наличие указанного ключа в массиве
Проверить наличие элемента в массиве
Проверить наличие элемента в массиве можно через функцию in_array() , которая возвращает «true» или «false».
$array = ['PHP', 'MySQL']; if (in_array('PHP', $array)) < echo 'Элемент «PHP» найден'; >
Вернуть позицию (ключ) массива
Получить позицию элемента в массиве можно через функцию array_keys() , которая возвращает ключи найденного элемента, или пустой массив, если элемент не найден.
$array = [ 90234 => 'PHP', 90421 => 'MySQL' ]; $lang_id = array_keys($array, 'PHP'); // array(90234)
Также есть функция array_search() , которая работает как пример выше, только возвращает позицию первого найденного элемента.
$array = [ 90234 => 'PHP', 90421 => 'MySQL', 91423 => 'PHP' ]; $lang_id = array_search('PHP', $array); // 90234
Число «0» в in_array()
Если будет идти поиск числа «0», то функция in_array() всегда будет возвращать «true» (т.е. элемент найден).
// пример in_array(), когда в массиве есть «0» $array = ['PHP', 'MySQL', 0]; in_array('PHP', $array); // Элемент найден in_array('Python', $array); // Элемент найден in_array('Ruby', $array); // Элемент найден
Функция in_array() проверяет каждый элемент массива, сравнивая их с переданным параметром. На каждом шаге параметр преобразуется в тип данных текущего элемента массива. И когда она дойдёт до «0», строка преобразуется в число и будет равняться «0», а число «0» есть в массиве. Поэтому если в массиве есть число ноль и идёт поиск строки, то in_array() всегда будет возвращать «true».
В этой ситуации для функции in_array() рекомендуется добавлять третий параметр true , который будет также проверять тип данных.
$array = ['PHP', 'MySQL', 0]; // с параметром «true» in_array('PHP', $array, true); // Элемент найден in_array('Ruby', $array, true); // Элемент не найден in_array('0', $array, true); // Элемент не найден in_array(0, $array, true); // Элемент найден
Обновлено: 01 ноября 2020
Комментарии
Авторизуйтесь, чтобы добавлять комментарии