При работе с массивами часто допускается ошибка, называемая «выход за границу массива». Она заключается в том, что из массива извлекается элемент по несуществующему индексу:
<?php
$animals = ['cats', 'dogs', 'birds'];
$animals[5]; // null
В разных языках программирования поведение в случае выхода за границу реализовано совершенно по-разному. Иногда возникает ошибка, иногда возвращается undefined
, как в JavaScript, а иногда подобный выход возвращает случайные данные из соседнего блока памяти, как в Си, что может привести к катастрофе.
В PHP свой путь. С одной стороны такой вызов вернёт null
, с другой — возникнет Notice с примерно таким сообщением: "PHP Notice: Undefined offset: 5". В общем случае, правильно всегда проверять доступность индекса и никогда не обращаться к массиву за его границами. Это безопасная стратегия, и вам будет проще адаптироваться к новым языкам, используя это универсальное решение.
Проверку наличия индекса в массиве можно сделать с помощью функции array_key_exists, которая первым параметром принимает индекс, а вторым массив для поиска.
<?php
$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()
как наиболее соответствующую смыслу.
<?php
$ages = [3, 2];
// isset принимает на вход массив, так как он используется, с подставленным индексом
if (isset($ages[3])) {
print_r('yeah!');
} else {
print_r('no');
}
// => no
С седьмой версии PHP в качестве синтаксического сахара к isset()
появился специальный оператор ??
. Он позволяет упростить проверку на существование, в том случае, когда нам нужно значение по умолчанию:
<?php
$age = $ages[3] ?? 5; // 5 - значение по умолчанию
// Эквивалентно этой строчке
$age = isset($ages[3]) ? $ages[3] : 5;
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт