【问题标题】:php string to integer conversion and comparisonphp字符串到整数的转换和比较
【发布时间】:2013-12-16 05:42:50
【问题描述】:

我有点困惑,希望你们能提供帮助。我正在写一些简单的东西,它从发布的名称字段中获取一个值并返回它,事先检查它是一个字符串(正确)还是一个整数(在这种情况下它会说'a name is not a number') .

<?php

$number = array("1","2","3","4","5","6","7","8","9","0");

if(!isset($_POST['submit'])){
?>
<p>Enter your name</p>
<form method="post" action="action4.php">
    <input type="text" name="name">
    <input type="submit" name="submit">
</form>
<?php
}else{
$name = $_POST['name'];
foreach($number as $v){
$int = (int)$v;
}
if($name == $int){
    print "This is a number and not a name.";
}else{
            print $name;
   }
}
?>

鉴于输入到名称字段中的每个数字都被视为字符串,我循环遍历数组并将每个数字转换为整数。然而,当在名称字段中输入一个整数时,我得到的是 $name,而不是“这是一个数字而不是一个名字”。相反,如果我输入一个字符串,我会得到“这是一个数字而不是一个名字”。

var_dumping if 语句中的 name 和 int 都按预期返回:$name 作为字符串,$int 作为整数。那么为什么他们比较真实呢?

【问题讨论】:

    标签: php string integer comparison operator-keyword


    【解决方案1】:

    因为您除了在foreach 循环中分配一个变量之外什么都不做,所以$v 的最终值是0。当 PHP 将字符串与整数进行比较时,它会将字符串转换为整数以进行比较(参见 Type Juggling)。所以$name 变成了00 等于 0 所以你的 if 语句总是正确的。

    要克服这个问题,您需要比较变量 typevalue(并在 foreach 循环中进行比较)。这意味着使用 === 比较运算符来比较类型和值,而不是像 == 那样只比较值。

    参考:Comparison operatorsType juggling

    【讨论】:

    • 第二部分很容易理解,但参考前半部分,你是说一旦在 foreach 语句之外 $int 读为 0?
    • 如果你不想确保输入中没有数字,正则表达式就可以了。例如如果 preg_match('/\d/', $name) 在 $name 中找到一个数字,它将返回一个正值。
    • 是的,仔细看看你的循环。它只是覆盖$v,将其值作为该数组的最后一个值0
    【解决方案2】:

    您必须使用=== 来比较变量的类型和值。如果你使用==,php 会在比较它们之前自动转换这两个值。

    但要检查输入是否不是整数,使用is_numeric 进行测试就足够了。

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      相关资源
      最近更新 更多