【问题标题】:Check if variable has value and isn't empty检查变量是否有值且不为空
【发布时间】:2016-08-05 14:09:09
【问题描述】:

我想检查一个数值变量是否有值(包括'0')并且不为空。 Empty 表示 EMPTY (''),而不是 '0'。

这真的是我能用 PHP 做的最好的事情吗?

if (isset($variable) && $variable !== '') { ... }

我想在不为其编写函数的情况下进行一次检查...

【问题讨论】:

  • $variable != ' ' 替换它。
  • isset($variable) AND !empty($variable) AND !is_numeric($variable) AND $variable !== false
  • @D.Joe 你可以为这种测试编写一个自定义函数,然后根据需要重新使用它
  • 看看this为什么'0'被认为是空的
  • 你回答了你自己的问题,这甚至不能解决你的问题。

标签: php variables


【解决方案1】:

您要检查的是字符串长度,而不是“空”。这可以使用strlen() 轻松完成。

if (isset($variable) && strlen($variable) > 0) {
    // Do something
}

如果您想将空白排除为无效,您也可以在其中添加trim()(通常推荐)。

if (isset($variable) && strlen(trim($variable)) > 0 } {
    // ...
}

【讨论】:

  • 如果变量未在您的 strlen 检查之前设置,您将收到警告
  • 这就是isset() 电话存在的原因(我忘了将它包含在我的原始答案中)。
  • 看我的回答,strlen 的效率远低于检查与'' 的强相等性。在单一情况下,没什么大不了的,但如果在一个大循环中会很重要
【解决方案2】:

您能做的最好的事情就是制作您自己的自定义函数。关键是通过引用传递变量以在传递未定义变量时不触发警告。作为评论发布,我会使用isset($variable) AND !empty($variable) AND !is_numeric($variable) AND $variable !== false 来涵盖所有情况。

您的自定义函数可能如下所示(改进版):

function is_blank(&$variable) {
    return (bool) !(isset($variable) AND (!empty($variable) OR is_numeric($variable) OR $variable === false));
}

https://3v4l.org/ZcCDu

【讨论】:

  • 夏洛特,OP 在问题中指出(按照我的标准,在没有月亮的午夜,它几乎像泥巴一样清晰):“我想用一张支票来做这件事,没有为它写一个函数......” - 如果你投了反对票,我可以向你保证,它不会来自我。这不是我的风格;-) 不过答案很好。
  • @Fred-ii- 我在他编辑问题之前就开始写答案 ;-) 它还说“你能做的最好的事情,...”如果他不想这样,不是我的错。 ;-)
  • 是的,我知道夏洛特.. 叹息。那么OP将不得不澄清问题,尝试某人的答案和/或在任何有效或无效的情况下发表评论。我不会添加任何其他东西到我的。直到我确切地知道我在这里处理的是哪种动物
  • @D.Joe 代码清洁度不是您所要求的。创建一个函数是你在计算上可以做的最糟糕的事情。您应该更改您的帖子以表明“什么会使我的代码易于阅读”,但这也是主观的。我认为与'' 的严格比较更容易理解
  • @Fred-ii- 别担心,我肯定也会想念我的手指的!
【解决方案3】:

是的,您的方式是最好(最有效)的方式:

  • 确保已设置变量(因此检查未设置的变量时不会收到警告)
  • 不是空字符串''
    • 但是,可能是'0'0falsenull[],它们在 php 中都算作空,但您希望按照 OP 的指示考虑为非空/li>
    • 您的 !== 将确保仅准确比较字符串 ''(无强制转换/转换)

strlen 的使用同样有效,但如果您查看生成的操作码,您会发现直接比较的计算效率要高出 3 倍(假设所有操作的权重相同,如果像 @987654329 这样的操作效率更高@ 执行比基本的IS_NOT_IDENTICAL 检查要多得多的周期)

!== ''version 字节码:

    IS_NOT_IDENTICAL                                     ~1      !0, ''

strlen() > 0 版本字节码:

     SEND_VAR                                                 !0
     DO_FCALL                                      1  $1      'strlen'
     IS_SMALLER                                       ~2      $1, 0

【讨论】:

  • 我对此表示赞同,因为它付出了努力和逻辑。
  • @Fred-ii- 感谢 php vld 库!
  • 很好的手册,嗯,雷?好吧,我要去泡一泡了,ciao 现在!
【解决方案4】:

(答案已被编辑。请参阅“三元运算”下的附加内容)。

为什么要麻烦使用所有这些?

只需使用“非空”if(!empty($var)){...}

但是,如果您将它与 GET 数组一起使用,那么可以;最好在条件语句中使用isset()empty()

我想检查一个变量是否有值(包括'0')并且不为空

这对我来说是:

检查一个值是否有值且不为空(如您所写)并且是否包含 0(零)

因此:

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


我想在不为其编写函数的情况下只进行一次检查...

然后使用三元运算符。

但是“没有功能”...好吧,你不能。您仍然需要“某种类型的功能”。

关于我上面提到的那个“三元运算符”。您可以在 Stack 上的这两个问答中引用所谓的“嵌套三元运算”:

这样你就不需要自定义函数了。

  • 旁注:到目前为止,我并没有拿走或试图拿走(夏洛特)接受的答案(应该保持接受)。这只是实现您(最终)目标的另一种方法。

【讨论】:

  • 0 被视为空,这是 OP 不想要的。
  • @CharlotteDunois 我误读了这个问题。我就把答案留在那里。毕竟,downvotes 也是“投票”。 ;-) 就像“糟糕的宣传仍然是宣传”。
  • 你可能是伪装的唐纳德特朗普吗? ;-)
  • 在他们的问题下阅读我的 cmets。完全没有意义,与自己和cmets离开是如此矛盾,我应该只是在池边等着,看着女孩们过去。
  • 这里太冷了,不能去游泳池。 :(
猜你喜欢
  • 2021-06-11
  • 2012-02-05
  • 2011-05-20
  • 2011-03-20
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多