【问题标题】:Basic PHP logic problemPHP基本逻辑问题
【发布时间】:2010-05-12 09:15:23
【问题描述】:
$this->totplpremium is 2400
$this->minpremiumq is 800

那么为什么这会返回 true?!

if ($this->totplpremium < $this->minpremiumq){

这些数字绝对正确,我肯定使用了“小于”符号。我搞不定。

【问题讨论】:

  • 你能展示一个完整的工作代码示例吗?
  • 尝试添加调试输出(即使只是一组简单的回显线)以确保这两个变量是 2400 和 800,如果是,我会看看你的花括号,看看是否任何都不合适。
  • 我猜的值有错误。请使用var_dump($this) 并发布输出。

标签: php logic


【解决方案1】:

也许存在某种转换问题。尝试使用

var_dump($this->totplpremium);
var_dump($this->minpremiumq);
if ($this->totplpremium < $this->minpremiumq){
  ...
}

查看数据类型是否正确

编辑:与使用调试输出相比,有些工具可以让您更轻松地调试代码 - http://xdebug.org/(PHP 的扩展,可让您调试)和 http://en.wikipedia.org/wiki/PHPEd(它是商业的。我不知道是否有另一种选择。)

【讨论】:

  • 可能是带有空格的字符串。 2400 &gt; 800"2400" &gt; "800",但 "2400 " &lt; "800 " - 由于空格,它们不会被类型处理为 int,并且字典上 2400 更小。
  • 2400 IS 作为字符串比较时小于 800。
  • @Salman A:不是的。来自documentation如果将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式进行比较。
  • @MartyIX:Xdebug + Notepad++ + Xdebug helper for Firefox 是一个轻量级的开源调试环境。当然,像 Eclipse 这样的所有大型 IDE 也都支持 Xdebug。
  • 解决了 - $this->totplpremium 是一个字符串。我之前用过“number_format()”。
【解决方案2】:

尝试用 intval 包装“数字”:

if (intval($this->totplpremium) < intval($this->minpremiumq)){
//...
}

如果这按预期工作,那么您确实需要使用 gettype 检查 totplpremium 和 minpremiumq 是什么类型,例如:

print(gettype($this->totplpremium));
print(gettype($this->minpremiumq));

有了这些信息,您应该能够查明您的错误。

【讨论】:

    【解决方案3】:

    按字母顺序比较,下面的说法是正确的:

    "800" > "2400"
    

    (因为8大于2)

    【讨论】:

    • 其实是假的。在进行比较之前,PHP 会将包含纯数字的字符串转换为数字。
    【解决方案4】:
    <?php
    
    $totplpremium="2400 ";
    $minpremiumq="800";
    
    var_dump(($totplpremium < $minpremiumq)?true:false);
    var_dump(((int)$totplpremium < (int)$minpremiumq)?true:false);
    
    ?>
    

    我猜你应该仔细检查这些值的来源,或者确保它们是整数。

    祝你编码好运!

    【讨论】:

    • 是的,2400 之后的空格是有目的的:强制将它们作为字符串进行比较!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多