Menu

PHP empty(): проверка пустой строки, массива и 0

empty($var) возвращает true, когда переменной нет или она ложна: null, false, 0, 0.0, "", "0" или []. Функция никогда не предупреждает о неопределённых переменных и ключах. Почему "0" считается пустым, как точно проверить пустую строку или массив, empty и isset, проверка полей формы.

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

empty($var) возвращает true, если переменной нет или её значение ложно: null, false, 0, 0.0, "", "0" или пустой массив []. Для любого другого значения она возвращает false. Как и isset(), она никогда не предупреждает о неопределённых переменных или ключах массива.

empty($x) это то же самое, что !isset($x) || !$x. Иначе говоря: отсутствует или приводится к false.

Какие значения пустые

Выберите значение в таблице, чтобы увидеть empty() рядом с isset() и приведением (bool). Каждую ячейку вычислил PHP 8.3.

empty, isset и (bool) для каждого значения $x
Point at or tap a cell to read it as PHP.
$xemptyissetbool
null
false
0
0.0
""
"0"
[]
" "
"0.0"
"a"
"null"
[0]
1
-1
Every cell computed by PHP 8.3.19.

Сюрпризы с обеих сторон: "0" пусто, а " " (пробел), "0.0", "null" и [0] нет.

"0" пусто: классическая ошибка

Поскольку "0" ложно, empty() воспринимает количество 0, счёт 0 или PIN "0" как "ничего не введено". Это бьёт по формам, где каждое значение приходит строкой.

Для текстового ввода надёжная проверка "ничего не введено" это trim($value) === "". Оставьте empty() для значений, где 0 действительно означает "ничего".

Проверка пустой строки

Чтобы точно проверить пустую строку, сравнивайте с "". Чтобы считать пустыми и одни пробелы, сначала примените trim. Начиная с PHP 5.5 empty() принимает выражения, так что empty(trim($s)) тоже работает (но с той же проблемой "0").

В PHP 8.1 и новее trim() не принимает null без уведомления об устаревании, поэтому в блоке написано trim($s ?? "").

Проверка пустого массива

Для массивов empty($arr), $arr === [] и count($arr) === 0 дают одинаковый ответ. Преимущество empty() в том, что она работает с переменной или ключом, которых может не быть.

array_filter() без колбэка удаляет все ложные значения, так что это быстрый способ спросить "есть ли в массиве что-то настоящее".

Проверка обязательного поля формы

!empty() часто используют, чтобы сделать поле обязательным, если только 0 не допустимый ответ. Запустите этот блок, оставьте поля пустыми и нажмите Send, затем заполните их и отправьте снова: скрипт выполнится ещё раз с заполненным $_POST.

empty($_POST["terms"]) покрывает для чекбокса оба случая: он не отправлен вовсе или отправлен с пустым значением. На странице о формах разобраны сообщения об ошибках для каждого поля.

empty и isset

Обе безопасны для неопределённых переменных и ключей. Они отвечают на разные вопросы:

  • isset($x): существует ли и не null ли? Для необязательных ключей, чекбоксов и вопроса "было ли это отправлено вообще".
  • !empty($x): существует ли и истинно ли? Для вопроса "есть ли что-то настоящее", когда 0 и "0" не в счёт.
  • $x === "" или $x === []: точно ли пусто? Когда 0 допустимое значение.

Другая половина описана на странице про isset, включая isset() с несколькими переменными сразу и отличие от array_key_exists().

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

Какие значения empty() считает пустыми в PHP?

empty($x) даёт true, когда $x не существует или равна null, false, 0, 0.0, "", "0" или []. Всё остальное не пусто, включая " " (пробел), "0.0", "false" и [0].

Почему "0" в PHP считается пустым?

empty() это то же самое, что !$x, только без предупреждения о неопределённых переменных, а строка "0" приводится к false. Поэтому empty() не подходит для полей, где 0 допустимый ответ; проверяйте $x === '' или trim($x) === ''.

Как проверить, пуст ли массив в PHP?

Работают и empty($arr), и $arr === [], и count($arr) === 0. empty() ещё и возвращает true, когда переменная не задана, а count() для неопределённой переменной выдал бы предупреждение и затем выбросил бы TypeError для null.

Когда использовать empty() вместо isset()?

Используйте isset(), когда нужно лишь знать, что значение существует (чекбокс отправлен, ключ настройки есть). Используйте !empty(), когда значение ещё и должно быть непустым, например обязательное текстовое поле. Осторожнее с полями, где 0 допустим: empty('0') даёт true.

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

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

НАЧАТЬ