Зарегистрируйтесь для доступа к 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;

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

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

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

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
Иконка программы PHP-разработчик
Профессия
с нуля
Разработка веб-приложений на Laravel
30 марта 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»