Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Проверка существования значения PHP: Массивы

При работе с массивами часто допускается ошибка, называемая «выход за границу массива». Она заключается в том, что из массива извлекается элемент по несуществующему индексу:

<?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

Оператор объединения с null

С седьмой версии PHP в качестве синтаксического сахара к isset() появился специальный оператор ??. Он позволяет упростить проверку на существование, в том случае, когда нам нужно значение по умолчанию:

<?php

$age = $ages[3] ?? 5; // 5 - значение по умолчанию
// Эквивалентно этой строчке
$age = isset($ages[3]) ? $ages[3] : 5;

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 120 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
27 октября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»