php: '0' как строка с пустым () - PullRequest
22 голосов
/ 10 ноября 2010

Я хочу, чтобы 0 рассматривался как целое число, а '0' - как строка, но empty () рассматривает '0' как строку в следующем примере,

$var = '0';

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is empty';
}

Как я могу 'сделать' empty (), чтобы принять '0 в качестве строк?

спасибо.

Ответы [ 13 ]

35 голосов
/ 10 ноября 2010

Вы не можете сделать это.Вот как это было разработано.Вместо этого вы можете написать and оператор для проверки:

if (empty($var) && $var !== '0') {
    echo $var . ' is empty';
}

Вы можете использовать isset, если, конечно, вы не хотите, чтобы он отклонил другие пустые места, которые empty проверяет.1007 *

Редактировать

Исправлена ​​проверка и для проверки типа, спасибо 2371 за указание на это:)

8 голосов
/ 10 ноября 2010

Вы не можете с empty. Из руководства по PHP:

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

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

Вы должны добавить еще один чек.

6 голосов
/ 10 ноября 2010

Вы не можете только с пустым (). См. руководство . Вы можете сделать это, хотя:

if ($var !== '0' && empty($var)) {
   echo "$var is empty and is not string '0'";
}

По сути, empty () делает то же самое, что и

if (!$var) ...

Но не вызывает уведомление PHP, когда переменная не установлена.

3 голосов
/ 16 июня 2017

PHP имеет различные функции, которые можно использовать для проверки значения переменной.Для этого есть три полезные функции: isset (), empty () и is_null ().Все эти функции возвращают логическое значение.Если эти функции используются неправильно, они могут привести к неожиданным результатам.

isset () и empty () часто рассматриваются как противоположные функции, однако это не всегда так.В этом посте я объясню различия между этими функциями.

isset ()

Из руководства по PHP - isset ():

isset — Determine if a variable is set and is not NULL

Другими словами, он возвращает true только тогда, когда переменная не равна нулю.empty ()

Из руководства по PHP - empty ():

empty — Determine whether a variable is empty

Другими словами, он вернет true, если переменная является пустой строкой, false,array (), NULL, «0?», 0 и неустановленная переменная.is_null ()

Из руководства по PHP - is_null ():

is_null — Finds whether a variable is NULL

Другими словами, он возвращает true только тогда, когда переменная равна нулю.is_null () противоположна isset (), за исключением одного различия, что isset () может применяться к неизвестным переменным, но is_null () только к объявленным переменным.

Таблица на рисунке представляет собой простую ссылку на то, что эти функции будут возвращать для различных значений.Пробелы означают, что функция возвращает bool (false).enter image description here

Также я сделал пользовательскую функцию для проверки всего материала.

function checkEmpty($var, $term = ""){
    if(isset($var) && trim($var) != "" && (!empty($var) || trim($var) == 0)){
        return true;
    }
    else{
        if($term != ""){
            return array("status" => "error", "desc" => "$term can not be empty");
        }
        else{
            return array("status" => "error", "desc" => "value can not be empty");
        }
    }
}
3 голосов
/ 10 ноября 2010

Вы не можете. С инструкция

Возвращает FALSE, если переменная имеет непустое и ненулевое значение.

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

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

Я всегда добавляю в свою кодовую базу

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

и использую ее вместо empty ().Это решает проблему сохранения нулей (int, float или string) как непустых.

См. http://www.php.net/manual/en/function.empty.php#103756, который был добавлен в мае 2011 года.

2 голосов
/ 10 ноября 2010

В обоих ваших случаях empty() вернет true. Проверьте документ - http://php.net/empty.

Я предлагаю использовать другую функцию, чтобы соответствовать вашей спецификации.

1 голос
/ 10 ноября 2010

empty - безусловно, самая запутанная и бесполезная функция в репертуаре php.Не используйте его.

При проверке значения вам нужно знать три отдельных вещи.

  • значение существует (используйте isset)
  • значениеимеет определенный тип (используйте is_xxx)
  • значение имеет определенные свойства (используйте операторы сравнения, strpos или регулярные выражения).

(последние два можно объединить в однос typecasts или '===').

Примеры:

if(isset($var) && is_string($var) && strlen($var) > 0)...
if(isset($var) && intval($var) > 0)...
if(isset($var) && $var === '0')...

Это кажется более многословным, но ясно показывает, что вы делаете.Для структурных объектов часто имеет смысл использовать ярлык, например,

 /// get a string
 function s($ary, $key, $default = '') {
     if(!isset($ary[$key])) return $default;
     $s = trim($ary[$key]);
     return strlen($s) ? $s : $default;
 }
 /// get a natural number
 function n($ary, $key, $default = 0) {
     $n = intval(s($ary, $key));
     return $n > 0 ? $n : $default;
 }

 $name = s($_POST, 'name');
 $age  = n($_POST, 'age');
1 голос
/ 10 ноября 2010
$var = '0';

// Evaluates to true because $var is empty
if (empty($var) && $var !== '0') {
    echo '$var is empty or the string "0"';
}
0 голосов
/ 20 декабря 2017

Если вы хотите пропустить пустой фильтр $ filter и не пропускать $ filter = '0' и другие значения

$filter = ''; //or $filter = '0'; or $filter = '1';

//trim the $filter

if( isset($filter) and ( $filter != '' or $filter == '0') ) {

//$filter data 

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...