在php中,将0视为空吗?


143

代码将详细说明:

$var = 0;

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

结果返回“其为空”。我以为empty()将检查是否已经设置了变量并在其中具有值。为什么返回“它为空”?


15
@stereo empty也许是最有用但广为人知的PHP函数。了解如何以及何时使用它。
deceze

2
@stereo empty本质上是的缩写isset($var) && $var != false。您必须empty非常怪异地用它射击自己。; P
deceze

@stereo 1)它在哪里“不一致”?就像锡罐上说的那样工作。2)轻松地将变量与进行比较false而不触发“未定义的变量”错误是没有用的吗?哦,好吧,猜想您永远都不要这样做……3)在安全上下文中选择错误的功能并不意味着该功能本身是不良的,无用的或不一致的;这只是意味着有人为这项工作选择了错误的功能。
deceze


18
@deceze-如果一个函数像那样被广泛误解empty(),则它的名称可能错误。
martinstoeckli

Answers:


189

http://php.net/empty

以下内容被认为是空的:

  • “”(空字符串)
  • 0(0为整数)
  • 0.0(0为浮点数)
  • “ 0”(0作为字符串)
  • 空值
  • array()(一个空数组)
  • var $ var; (已声明变量,但类中没有值)

请注意,这与强制转换为Boolean的列表完全相同falseempty很简单!isset($var) || !$var。试试吧isset


因此,我必须像这样检查:if(isset($ var)&& $ var!= 0){做某事}?
mysqllearner 2010年

1
@mysql对于这种情况,您最好使用!empty($var),但是请注意,这与您在问题中所写的内容不同。使用什么完全取决于您要考虑的值true。只需比较和之间的差异,isset然后empty为正确的情况选择正确的组合即可。
降低

7
@mysqllearner:如果isset返回。但是,你的意思是一样的True$var=0if(isset($var) && $var != 0)empty
费利克斯·克林

@mysqllearner isset检测它是否不为空。要检查它是否为空,请改用!isset。

1
@Deji由于PHP的根源是网络语言,并且HTTP请求中的值始终是字符串,'0'因此被视为等效于0。这是PHP的核心设计理念。我同意这是一个极具争议的选择,但是,我不是在这里与您讨论这个选择。在PHP的逻辑范围内,empty等效于== false减号的通知是IMO。PHP中的某些事物与它们之间应该有很大的不同是不同的话题。
降低

76

我想知道为什么没人建议非常方便的Type比较表。它回答有关通用功能的所有问题并比较运算符。

摘录:

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” =否
Mohd Ali说

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以忽略错误日志,以防万一...不要创建一个大日志
Miguel

你为什么要放@strlen。只要您传递变量,它就不会输出错误。如果您的strlen为空,它将记录为0。
sketchthat

2
如果未设置变量,我相信您会收到错误消息。
埃夫伦·尤特森

11

最近,我也被这条裤子束缚住了。我们经常处理的问题是未设置的变量-表示可能存在或未曾存在过的form元素,但对于许多元素0(或字符串)'0'可能会更准确地通过帖子,但仍将其评估为“ falsey” )是在下拉列表中说的合法值。

使用 empty()strlen()如果需要的话,最好先,然后再是最好的选择,例如:

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}

6

从语言学的角度来看,没有价值的意思。就像其他人说的那样,您必须使用isset()来检查是否已定义变量,这就是您要做的。


1
这个简单的答案帮助我轻松地解决了0对立null问题。谢谢!
Giacomo1968 '18


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手册

在您的情况下$var0,因此empty($var)将返回true,则在测试结果之前将其取反,因此else块将运行,并给出“ Its empty”作为输出。


1

从手册开始:如果var具有非空且非零值,则返回FALSE。

以下内容被认为是空的:

  • “”(空字符串)
  • 0(0为整数)
  • “ 0”(0作为字符串)NULL
  • FALSE array()(一个空数组)var
  • $ var; (已声明变量,但类中没有值)

更多:http : //php.net/manual/zh/function.empty.php


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

就我而言,此代码有效。


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

不知道是否还有人在寻找解释和解决方案。上面的评论全部说明了TRUE / FALSE / 1/0之间的区别。
我只想带2美分来显示实际值。

布兰

如果您使用的是布尔数据类型,则需要查找TRUE与FALSE的结果;如果您将其存储在MySQL中,它将以1 resp的形式存储。0(如果我没有记错的话,这在您的服务器内存中是相同的)。

因此,要在PHP中显示该值,您需要检查它是true(1)还是false(0),并显示所需的任何内容:“ TRUE”或“ FALSE”或“ 1”或“ 0”。
注意,在PHP中,所有大于0(或不同于0)的东西都将被视为TRUE。例如:2,“ abc”等都将返回TRUE。

BIT,TINYINT

如果您使用数字数据类型,则其存储方式是相同的。
要显示该值,您需要告诉PHP将其作为数字来处理。我发现最简单的方法是将其乘以1。


0

正确的例子。只需在数据库中创建int类型字段(例如手机号码),然后通过表单为以下数据库提交空白值,或仅使用SQL插入即可。它将保存在数据库0中的内容,因为它是int类型,不能保存为空白或null。因此,它为空,但将另存为0。因此,当您通过PHP提取数据并检查空值时。这是非常有用的,并且在逻辑上是正确的。

0.00,0.000,0.0000 .... 0.0 ... 0也为空,上面的示例也可以用于在数据库中存储不同类型的值,例如float,double,decimal(十进制具有0.000等不同的变体,依此类推。


0

您需要使用isset()来检查是否设置了值。


@Veershetty,您好,欢迎来到Stack Overflow。谢谢您的回答,但是它似乎并没有在现有的更详细的答案上添加任何新内容。编辑答案以添加其他答案缺少的详细信息,或者考虑删除答案(如果没有添加任何新内容)。
Gricey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.