У php, 0 вважається порожнім?


144

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

$var = 0;

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

Результат повертає "Її порожньо". Я думав, що порожній () перевірить, чи я вже встановив змінну і чи є всередині значення. Чому він повертає "Своє порожнє" ??


15
@stereo empty- це, мабуть, найбільш корисна, але широко зрозуміла функція PHP. Дізнайтеся, як і коли ним користуватися.
деге

2
@stereo emptyпо суті короткий isset($var) && $var != false. Ви повинні триматися за своє emptyдуже дивне, щоб стріляти собі в ногу. ; P
деге

@stereo 1) Де це "непослідовно"? Це працює так, як написано на жерсті. 2) Мало порівнювати змінну з falseне викликати помилку "невизначеної змінної" марно? Ну добре, здогадайтесь, ви ніколи цього не робите ... 3) Вибір неправильної функції в контексті безпеки не означає, що сама функція є поганою, марною або непослідовною; це просто означає, що хтось обрав неправильну функцію для роботи.
деге


18
@deceze - Якщо функція настільки неправильно зрозуміла, як empty(), то, ймовірно, вона має неправильну назву.
martinstoeckli

Відповіді:


189

http://php.net/empty

Наступні речі вважаються порожніми:

  • "" (порожній рядок)
  • 0 (0 як ціле число)
  • 0,0 (0 як поплавок)
  • "0" (0 як рядок)
  • НУЛЬ
  • ПОМИЛКОВИЙ
  • array () (порожній масив)
  • var $ var; (змінна оголошена, але без значення в класі)

Зауважте, що це абсолютно той самий список, що і для примусу до Булевого false. emptyпросто !isset($var) || !$var. Спробуйте issetзамість цього.


Отже, я повинен перевірити так: якщо (isset ($ var) && $ var! = 0) {Зроби щось} ??
mysqllearner

1
@mysql У цьому випадку ви також можете використовувати !empty($var), але зауважте, що це не те саме, що ви написали у запитанні. Що використовувати, повністю залежить від того, які значення ви хочете вважати true. Просто порівняйте відмінності між issetі emptyвиберіть правильну комбінацію для правильної ситуації.
деге

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, ніж вони, - це інша тема.
деле

76

Мені було цікаво, чому ніхто не запропонував надзвичайно зручну таблицю порівняння типу . Він відповідає на кожне запитання про загальні функції та порівнює оператори.

Фрагмент:

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 = вірно, 0,00 = вірно, "0,0" = помилково
сказав Мохд Алі

34

У разі числових значень слід використовувати функцію 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
Якщо змінна не встановлена, я вірю, що ви отримаєте помилку.
Еврен Юртесен

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()повертає істину для всього, що оцінює FALSE, це насправді !маскування "не" ( ). Я думаю, ти мав на увазі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

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 як рядок)
  • НУЛЬ
  • ПОМИЛКОВИЙ
  • array () (порожній масив)
  • var $ var; (змінна оголошена, але без значення в класі)

З посібника PHP

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


1

З посібника: повертає FALSE, якщо значення var має не порожнє та ненульове значення.

Наступні речі вважаються порожніми:

  • "" (порожній рядок)
  • 0 (0 як ціле число)
  • "0" (0 як рядок) NULL
  • FALSE масив () (порожній масив) var
  • $ var; (змінна оголошена, але без значення в класі)

Детальніше: http://php.net/manual/en/function.empty.php


1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

У моєму випадку цей код спрацював.


0

Власне, просто перевірте, чи змінна встановлена ​​чи ні. У цьому випадку, якщо ви хочете перевірити, чи ваша змінна дійсно нуль чи порожня, ви можете використовувати цей приклад:

$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));повернеться помилковим.

якщо ви перевіряєте речі в масиві, ви завжди повинні робити isset($var)спочатку.


0

використання лише ($_POST['input_field_name'])!=0замість !($_POST['input_field_name'])==00 не вважається порожнім.


0

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

БУЛЕЙСЬКИЙ

Якщо ви працюєте з булевим типом даних, ви шукаєте результат TRUE vs. FALSE; якщо ви зберігаєте його в MySQL, він буде зберігатися як 1 респ. 0 (якщо я не помиляюся, це те саме в пам’яті вашого сервера).

Отже, щоб відобразити значення в PHP, вам потрібно перевірити, чи це правда (1) або неправда (0), і відобразити все, що вам потрібно: "TRUE" або "FALSE" або можливо "1" або "0".
Увага, все, що більше (або відрізняється) від 0, також буде розглядатися як ІСТИНА в PHP. Наприклад: 2, "abc" і т. Д. Всі повернуть ПРАВИЛЬНО.

BIT, TINYINT

Якщо ви працюєте з числовим типом даних, спосіб його зберігання однаковий.
Щоб відобразити значення, потрібно сказати 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, ласкаво просимо в стек переповнення. Дякую за вашу відповідь, однак, схоже, це не додасть нічого нового над існуючими, більш детальними відповідями. Або відредагуйте відповідь, щоб додати детальну інформацію, якої немає в інших відповідях, або розглядайте питання про видалення відповіді, якщо вона не додає нічого нового.
Грицей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.