代码之家  ›  专栏  ›  技术社区  ›  St. John Johnson

将字符串与整数进行比较会产生奇怪的结果

  •  29
  • St. John Johnson  · 技术社区  · 17 年前

    我真的搞不懂为什么这个手术会奏效。有人能解释一下吗?

    $test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
    $test2 = "3581169b064f71be1630b321d3ca318f";
    
    if ($test1 == 0)
      echo "Test 1 is Equal!?";
    if ($test2 == 0)
      echo "Test 2 is Equal!?";
    
    // Returns: Test 1 is Equal!?
    

    为了澄清,我试图比较字符串 "0" 到 $test 0 在里面 "" s

    我想知道这是一个PHP错误,一个服务器错误,还是一个有效的操作。根据 http://us3.php.net/types.comparisons 不应该

    编辑: 请注意,显然它确实提到字符串和0之间的松散比较是正确的。但我还是不知道为什么。

    我已经修改了我的问题,为什么 $test2 "3581169b064f71be1630b321d3ca318f" 不工作?

    5 回复  |  直到 12 年前
        1
  •  43
  •   Assaf Lavie    17 年前

    From the PHP manual :

    字符串到数字的转换

    和类型确定如下。

    如果它包含任何 字符“.”、“e”或“e”。 否则,它将被评估为

    该值由初始值给出 从有效的数字数据开始,此 将是使用的值。否则 值将为0(零)。有效数字 数据是可选符号,后跟 一个或多个数字(可选) 包含小数点),后跟 “e”或“e”后跟一个或多个 更多数字。

        2
  •  11
  •   thomasrutter    13 年前

    使用==运算符进行类型转换

    explained here .

    page you linked to 这并不矛盾。检查第二个表,其中显示比较整数 0 一串 "php" 使用 == 应该是真的。

    0 .

    由数字组成或以数字开头的字符串被视为 . 如果字符串在该数字之后有其他字符,则忽略这些字符。

    如果字符串以不能解释为数字一部分的字符开头,则它是一个 非数字字符串 0 "-1" 是数字字符串,因为在这种情况下减号是数字的一部分。

    例如,你的字符串 "d85d1d81b25614a3504a3d5601a9cb2e" . 但是你的第二根弦 "3581169b064f71be1630b321d3ca318f" 将转换为整数 3581169

    你该怎么办

    if ($test1 === "0")
    

    请注意使用了三重等于而不是双等于。这样可以确保比较的字符串仅包含数字零,并防止任何类型转换。

        3
  •  8
  •   St. John Johnson    17 年前

    当强制转换为整数时,将转换为0。

    这意味着:

    ("php" == 0) === true
    ("1php" == 0) === false
    

        4
  •  2
  •   HBR    12 年前
    $test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
    

    该字符串以“d”开头,这是无效的数字,var将解析为0,测试#1将通过。

    $test2 = "3581169b064f71be1630b321d3ca318f";
    

    该字符串以3581169开头,这是一个有效数字,因此var将解析为不等于0的值。

        5
  •  1
  •   Eiad Samman    12 年前

    数字字符串 是一个数字:

    $test1="19de6a91d2ca9d91721d82f1bd8102b6";
       echo (float)$test1==$test1; //TRUE
       echo is_float($test1); //FALSE
    
       //Converting the string to float and then converting it to string and compare will do the trick 
       echo (string)((float)$test1)==(string)$test1; //FALSE
    
    
    $test2="5.66";
       echo (float)$test2==$test2; //TRUE
    
       //Testing the numeric string using `is_float` wont give the expected result
       echo is_float($test2); //FALSE
    
       echo (string)((float)$test2)==(string)$test2; //TRUE