31

我希望将 0 视为整数,将 '0' 视为字符串,但在下面的示例中,empty() 将 '0' 视为字符串,

$var = '0';

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

我怎样才能“使”空()将“0”作为字符串?

4

12 回答 12

50

你不能让 empty() 接受它。这就是它的设计方式。相反,您可以编写一个and语句来测试:

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

您可以使用isset,当然,除非您希望它拒绝empty检查的其他空。

于 2010-11-09T22:27:20.160 回答
9

你不能用empty. 来自 PHP 手册:

以下内容被认为是空的:

  • ""(一个空字符串)
  • 0(0 为整数)
  • "0" (0 作为字符串)
  • 无效的
  • 错误的
  • array() (一个空数组)
  • 变量$变量;(声明的变量,但在类中没有值)

您必须添加额外的其他检查。

于 2010-11-09T22:27:39.537 回答
6

你不能只用empty()。请参阅手册。你可以这样做:

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

基本上,empty() 与以下内容相同:

if (!$var) ...

但是当未设置变量时,它不会触发 PHP通知。

于 2010-11-09T22:29:03.310 回答
6

PHP 有不同的函数可用于测试变量的值。三个有用的函数是isset()empty()is_null()。所有这些函数都返回一个布尔值。如果这些功能没有以正确的方式使用,它们可能会导致意想不到的结果。

isset() 和 empty() 通常被视为相反的函数,但并非总是如此。在这篇文章中,我将解释这些函数之间的区别。

伊塞特()

来自 PHP 手册 – isset()

isset — 确定变量是否已设置且不为 NULL

换句话说,只有当变量不为空时它才返回真。空的()

来自 PHP 手册 – empty()

empty — 确定变量是否为空

换句话说,如果变量是一个空字符串,它会返回真,假,array(),NULL,“0?,0,和一个未设置的变量。一片空白()

来自 PHP 手册 – is_null()

is_null — 查找变量是否为 NULL

换句话说,只有当变量为空时它才返回真。is_null() 与 isset() 是相反的,不同之处在于 isset() 可以应用于未知变量,而 is_null() 只能应用于已声明的变量。

图片中的表格是这些函数将为不同值返回的内容的简单参考。空格表示函数返回bool (false)。

在此处输入图像描述

我还制作了一个自定义函数来检查所有内容:

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");
        }
    }
}
于 2017-06-16T11:13:29.857 回答
3

你不能。从手册

如果 var 具有非空且非零值,则返回 FALSE。

以下内容被认为是空的:

  • ""(一个空字符串)
  • 0(0 为整数)
  • "0" (0 作为字符串)
  • 无效的
  • 错误的
  • array() (一个空数组)
  • 变量$变量;(声明的变量,但在类中没有值)
于 2010-11-09T22:28:23.593 回答
2

我总是将它添加到我的代码库中:

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

并使用它来代替 empty()。它解决了将零(int、float 或 string)保持为非空的问题。

请参阅2011 年 5 月添加的is_blank() 。

于 2011-05-11T00:08:12.370 回答
2

在这两种情况下empty()都会返回true。检查文档

我建议使用不同的函数来匹配您的规范。

于 2010-11-09T22:28:20.420 回答
1
$var = '0';

// Evaluates to true because $var is empty
if (empty($var) && $var !== '0') {
    echo '$var is empty or the string "0"';
}
于 2010-11-09T22:31:55.413 回答
1

empty是迄今为止 PHP 曲目中最令人困惑和无用的函数。不要使用它。

检查值时,您需要了解三件不同的事情。

  • 值存在(使用 isset)
  • 该值具有特定类型(使用 is_xxx)
  • 该值具有特定属性(使用比较运算符strpos或正则表达式)。

(最后两个可以通过类型转换或'==='组合成一个)。

例子:

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

这似乎更冗长,但它清楚地显示了你在做什么。对于结构对象,通常有一个快捷方式 getter 是有意义的,例如

 /// 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');
于 2010-11-09T23:00:45.557 回答
1

如果你想跳过一个空的 $filter 并且不要跳过 $filter = '0' 和其他值:

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

// Trim the $filter

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

    // $filter data

};
于 2017-12-20T09:50:33.540 回答
0

在这种情况下,不要使用 empty()。使用 isset() 代替它。这也将允许 0 作为整数。

$var = '0';
if (!isset($var)) {
    print '$var is not set';
}

$var = 0;
if (!isset($var)) {
    print '$var is not set';
}

也不应该打印任何东西。

于 2010-11-09T22:26:53.407 回答
0

你不能,因为整数、字符串、浮点数和空值对于 PHP 来说并不重要。

因为它很酷:)

您必须检查变量的特征:is_numeric()isset()、 === 、strlen()等。

例如:

if (strlen(@$var)==0) {
    echo @$var . ' is empty';
}

或者

if (@$var==="" || !isset($var)) {
    echo @$var . ' is empty';
}

或其他例子:)

于 2017-01-27T12:26:55.790 回答