【问题标题】:empty() returns true if a zero float value was passed as string如果零浮点值作为字符串传递,则 empty() 返回 true
【发布时间】:2021-04-04 03:59:15
【问题描述】:

当小数作为字符串返回时,使用 PHP 的 MySQL 有时会很烦人,就像使用 MYSQL 函数一样。有没有一个函数可以检查一个变量是否是其中的任何一个?

null, (bool)false, (int)0, (float)0.00, (string)"", (string)"0", (string)"0.00", or (array)[].

empty() 几乎可以完成这项工作,但有时会以字符串形式返回这些 mysql 十进制值。 isset() 和 is_null() 在 PHP 7 和 8 中的操作方式不同。我缺少像 emptyish() 这样的东西。

什么不能用 empty():

if (empty($var)) // Doesn't work for decimal/floats passed as string "0.00"
if (!isset($var) || !$var) // Does not work in PHP 8 for an empty string
if ($var == 0) // Leaves a warning if $var is not declared

【问题讨论】:

  • 使用严格的比较。始终知道您的值是什么数据类型。
  • @JohnConde 这并不总是很方便。表单可以将数值作为字符串传递,MySQL PHP 驱动程序有时可以将 int 和 float 作为字符串返回。当然可以说明变量类型和比较的整个转换。但让我们现实一点,时间就是金钱。
  • 那么你想检测 0、空字符串还是所有可能的“空”值?
  • 这听起来像是 XY 问题。你到底想在这里解决什么?您无法使用一行代码检查所有可能的情况。你需要有一些期望。如果您需要一个字符串,请检查该变量是否已设置且不是空字符串。如果您期望一个整数,请检查该值是否已设置,并且不是 0。等等
  • @Dharman 可能你有点过于复杂了。我不关心变量类型。我只是想确定变量是否为空。

标签: php comparison php-7 string-comparison php-8


【解决方案1】:

这种零/空条件在 PHP 7 和 8 版本中的工作方式相同:

if (empty($var) || (float)$var == 0)

它检查 $var 是否为以下任何一种: 未设置, null, (bool)false, (int)0, (float)0.00, (string)"", (string)"0", (string)"0.00", or (array)[]

并替换为空():

function nil(&$var) { // https://www.dictionary.com/browse/nil
  return (empty($var) || (float)$var == 0);
}

用法如下:

if (nil($var)) {
  echo 'The value is either not set, an empty string, empty array, null, or equals zero.';
}

【讨论】:

  • 嗯...你永远不应该比较浮点相等,但总是不相等。
  • @LarsStegelitz 需要回答吗?
【解决方案2】:

检查此isset gettype

Isset 检查 null 而不是空值。通过 gettype 可以避免输入字符串。

if(isset($var) || gettype($v) !== 'string'){
.
.
.
}

【讨论】:

  • 我不关心变量类型,我只关心它是否为空或零。
【解决方案3】:

使用isset()。

<?php
if(isset($var)){
  //$var is set
  if(!$var){
    //$var is 0
  } else if(empty($var)){
    //$var is empty
  } else {
    //code goes here
  }
}else{
  //$var is not set
}

【讨论】:

  • empty() after isset() 总是不合适的 -- 已经保证声明了元素。
猜你喜欢
  • 2015-05-28
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多