В php 0 считается пустым?

150

Код объяснит больше:

$var = 0;

if (!empty($var)){
echo "Its not empty";
} else {
echo "Its empty";
}

Результат возвращает «Пусто». Я думал, что empty () проверит, установил ли я уже переменную и имею ли значение внутри. Почему он возвращает "Пусто" ??

mysqllearner
источник
16
@stereo empty, пожалуй, самая полезная, но неправильно понимаемая функция PHP. Узнайте, как и когда его использовать.
deceze
2
@stereo empty- это сокращение от isset($var) && $var != false. Вы, должно быть, держитесь emptyочень странно, чтобы выстрелить себе в ногу этим. ; P
deceze
@stereo 1) Где "непоследовательно"? Работает так, как написано на банке. 2) Бесполезно сравнивать переменную с falseошибкой «неопределенная переменная» без появления ошибки? Что ж, думаю, вы никогда этого не сделаете ... 3) Выбор неправильной функции в контексте безопасности не означает, что сама функция плохая, бесполезная или несовместимая; это просто означает, что кто-то выбрал неправильную функцию для работы.
deceze
RTFM php.net/manual/en/function.empty.php
Xavier Барбоса
19
@deceze - Если функция так часто понимается неправильно empty(), то, вероятно, у нее неправильное имя.
martinstoeckli

Ответы:

197

http://php.net/empty

Пустыми считаются следующие вещи:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • 0,0 (0 в виде числа с плавающей точкой)
  • «0» (0 в виде строки)
  • ЗНАЧЕНИЕ NULL
  • ЛОЖНЫЙ
  • array () (пустой массив)
  • var $ var; (объявленная переменная, но без значения в классе)

Обратите внимание, что это точно такой же список, что и для приведения к логическому типу false. emptyпросто !isset($var) || !$var. Попробуйте issetвместо этого.

обмануть
источник
Итак, я должен проверить так: if (isset ($ var) && $ var! = 0) {Do Something} ??
mysqllearner
1
@mysql В этом случае вы также можете использовать !empty($var), но обратите внимание, что это не то же самое, что вы написали в вопросе. Что использовать, полностью зависит от того, какие ценности вы хотите рассматривать true. Просто сравните различия между issetи emptyи выберите правильную комбинацию для правильной ситуации.
deceze
7
@mysqllearner: issetвозвращает, Trueесли $var=0. Но то, что вы имеете в виду, if(isset($var) && $var != 0)то же самое, что иempty
Феликс Клинг
@mysqllearner isset определяет, НЕ пусто ли оно. чтобы проверить, пусто ли оно, используйте! isset.
1
@Deji Поскольку PHP имеет свои корни как веб-язык, а значения в HTTP-запросах всегда являются строками, '0'он рассматривается как эквивалент 0. Это основная философия дизайна PHP. Я согласен с тем, что это крайне спорный выбор, однако я здесь не для того, чтобы обсуждать этот выбор с вами. В логике PHP, emptyкак эквивалент == falseминусовых уведомлений, это нормально, IMO. То, что некоторые вещи в PHP должны быть совсем другими, чем они есть, - это отдельная тема.
deceze
77

Мне было интересно, почему никто не предложил чрезвычайно удобную таблицу сравнения типов . Он отвечает на все вопросы об общих функциях и операторах сравнения.

Фрагмент:

Expression      | empty($x)
----------------+--------
$x = "";        | true    
$x = null       | true    
var $x;         | true    
$x is undefined | true    
$x = array();   | true    
$x = false;     | true    
$x = true;      | false   
$x = 1;         | false   
$x = 42;        | false   
$x = 0;         | true    
$x = -1;        | false   
$x = "1";       | false   
$x = "0";       | true    
$x = "-1";      | false   
$x = "php";     | false   
$x = "true";    | false   
$x = "false";   | false   

Наряду с другими шпаргалками я всегда храню распечатку этой таблицы на своем столе на случай, если я не уверен

Дэн Мыло
источник
2
Вам следует обновить шпаргалку сейчас, я дам вам еще ... 0.0 = true, 0.00 = true, "0.0" = false
Сайед Мохд Али
38

В случае числовых значений следует использовать функцию is_numeric:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}
Хандад Ниази
источник
1
Хороший обходной путь, когда вам нужно проверить на «0» или «0»
nicooo.
12

strlen()Вместо этого используйте . Я столкнулся с той же проблемой, используя 1/0 в качестве возможных значений для некоторых переменных. Я использую, if (strlen($_POST['myValue']) == 0)чтобы проверить, есть ли символ в моей переменной.

Калин Русу
источник
просто добавьте @strlen, чтобы опустить журнал ошибок, на всякий случай ... чтобы не создавать большой журнал
Мигель
Зачем ставить @strlen. Пока вы передаете переменную, она не должна выводить ошибку. Если ваш strlen пуст, он запишет значение как 0.
sketchthat
2
Если переменная не установлена, я думаю, вы получите ошибку.
Evren Yurtesen 02
11

Меня недавно поймали со спущенными штанами и на этом. Проблема, с которой мы часто сталкиваемся, - это неустановленные переменные - скажем, элемент формы, который мог быть или не был там, но для многих элементов 0(или строка, '0'которая будет проходить через сообщение более точно, но все равно будет оценена как "ложная" ) является допустимым значением, например, в раскрывающемся списке.

Если вам это нужно, лучше всего использовать empty()сначала, а затем strlen():

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}
Оливер Уильямс
источник
6

С лингвистической точки зрения « пустое » означает « не имеющее ценности» . Как и другие говорили, вам придется использовать isset(), чтобы проверить, была ли определена переменная, что вы делаете.

Эльзо Валуги
источник
1
Этот простой ответ помог мне прояснить 0против nullпроблемы с легкостью. Благодарность!
Giacomo1968
4

empty()возвращает true для всего, что оценивается FALSE, на самом деле это !замаскированный not ( ). Я думаю ты имел ввидуisset()

слияние душ
источник
4

Чтобы принять 0 как значение в переменной, используйте isset

Проверить, пуста ли переменная

$var = 0;

if ($var == '') {
    echo "empty";
} else {
    echo "not empty"; 
}
//output is empty

Проверьте, установлена ​​ли переменная

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty
bhu1st
источник
4

Это работает для меня!

//
if(isset($_POST['post_var'])&&$_POST['post_var']!==''){
echo $_POST['post_var'];
}

//results:
1 if $_POST['post_var']='1'
0 if $_POST['post_var']='0'
skip if $_POST['post_var']=''
Тоан Нгуен Тай
источник
1

Пустыми считаются следующие вещи:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • «0» (0 в виде строки)
  • ЗНАЧЕНИЕ NULL
  • ЛОЖНЫЙ
  • array () (пустой массив)
  • var $ var; (объявленная переменная, но без значения в классе)

Из руководства по PHP

В вашем случае $varэто 0, так empty($var)вернется true, вы отрицая результат перед тестированием, так что еще блок будет работать давая « Its empty» в качестве выходного сигнала.

codaddict
источник
1

Из руководства: возвращает FALSE, если var имеет непустое и ненулевое значение.

Пустыми считаются следующие вещи:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • «0» (0 в виде строки) NULL
  • FALSE array () (пустой массив) var
  • $ var; (объявленная переменная, но без значения в классе)

Подробнее: http://php.net/manual/en/function.empty.php

Адам Кисс
источник
1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

В моем случае этот код работал.

Cherrish
источник
0

На самом деле isset просто проверяет, установлена ​​ли переменная или нет. В этом случае, если вы хотите проверить, действительно ли ваша переменная равна нулю или пуста, вы можете использовать этот пример:

$myVar = '';
if (empty($myVar))
{
  echo "Its empty";
}
echo "<br/>";

if ($myVar===0)
{
  echo "also zero!";
}

просто для заметки $ myVar == 0 действует как пустая функция.

сыпь
источник
0

пустой должен означать пустой .. что бы ни сказал обман.

Когда я делаю

$var = '';    
$var = '0';

Я ожидаю, что var_dump(empty($var));вернется false.

если вы проверяете что-то в массиве, вам всегда нужно делать это в isset($var)первую очередь.

Пол Вольберс
источник
0

использовать только ($_POST['input_field_name'])!=0вместо !($_POST['input_field_name'])==00 не считается пустым.

Маниш Шарма
источник
0

Не уверен, что еще есть люди, которые ищут объяснение и решение. Приведенные выше комментарии говорят о различиях между TRUE / FALSE / 1/0.
Я просто хотел бы принести свои 2 цента за способ отображения фактического значения.

BOOLEAN

Если вы работаете с логическим типом данных, вам нужен результат ИСТИНА или ЛОЖЬ; если вы сохраните его в MySQL, он будет сохранен как 1 соотв. 0 (если не ошибаюсь, в памяти вашего сервера то же самое).

Итак, чтобы отобразить значение в PHP, вам нужно проверить, истинно ли оно (1) или ложно (0), и отобразить все, что вы хотите: «ИСТИНА» или «ЛОЖЬ» или, возможно, «1» или «0».
Внимание, все, что больше (или отличается) от 0, также будет считаться ИСТИННЫМ в PHP. Например: 2, «abc» и т. Д. Вернут ИСТИНА.

БИТ, ТИНИИНТ

Если вы работаете с числовым типом данных, способ его хранения такой же.
Чтобы отобразить значение, вам нужно указать PHP, чтобы он обрабатывал его как число. Самый простой способ, который я нашел, - это умножить его на 1.

Алекс Таннер
источник
0

правильный пример. просто создайте поле типа int (например, номер мобильного телефона) в базе данных и отправьте пустое значение для следующей базы данных через форму или просто вставьте с помощью SQL. что он будет сохранен в базе данных 0, потому что это тип int и не может быть сохранен как пустой или пустой. поэтому он пуст, но будет сохранен как 0. Поэтому, когда вы извлекаете данные через PHP и проверяете пустые значения. это очень полезно и логически правильно.

0.00, 0.000, 0.0000 .... 0.0 ... 0 также пусто, и приведенный выше пример также можно использовать для хранения различных типов значений в базе данных, таких как float, double, decimal (десятичные числа имеют разные варианты, такие как 0.000 и т. Д.).

Сайед Мохд Али
источник
0

Вам нужно использовать isset (), чтобы проверить, установлено ли значение.

Виршетти
источник
Привет, @Veershetty, добро пожаловать в Stack Overflow. Спасибо за ответ, однако, похоже, он не добавляет ничего нового по сравнению с существующими более подробными ответами. Либо отредактируйте ответ, чтобы добавить детали, которые отсутствуют в других ответах, либо подумайте об удалении своего ответа, если он не добавляет ничего нового.
Gricey