将String与Integer进行比较会产生奇怪的结果

时间:2009-03-23 02:14:02

标签: php casting comparison

我真的很困惑为什么这个操作有效。有人可以解释一下吗?

$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 ""中包含$test2的代码(我应该有)

我想知道这是一个PHP错误,服务器错误,还是某种有效的操作。根据{{​​3}},不应该有效。

编辑:抓一点,显然它确实提到字符串和0之间的松散比较是真的。但我仍然不知道为什么。

编辑2:我修改了我的问题,为什么"3581169b064f71be1630b321d3ca318f"的{​​{1}}值不起作用?

5 个答案:

答案 0 :(得分:33)

From the PHP manual

  

字符串转换为数字

     

在a中评估字符串时   数值上下文,结果值   和类型确定如下。

     

该字符串将被评估为a   浮点数,如果它包含任何   字符'。','e'或'E'。   否则,它将被评估为   整数。

     

该值由初始值给出   字符串的一部分。如果是字符串   从有效的数字数据开始,这个   将是使用的价值。否则,   值为0(零)。有效数字   数据是可选的符号,后跟   一个或多个数字(可选   包含小数点),紧随其后   通过可选的指数。指数   是一个'e'或'E'后跟一个或   更多数字。

答案 1 :(得分:9)

使用==运算符

进行类型转换

==运算符是一种松散类型的比较。它会将两者转换为常见类型并进行比较。字符串转换为整数的方式是explained here

请注意page you linked to与此并不矛盾。检查第二个表,其中表示使用0将整数"php"与字符串==进行比较将为真。

字符串转换为整数,非数字字符串(不包含或以数字开头的字符串)转换为0

数字与非数字字符串

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

如果字符串以不能被解释为数字一部分的字符开头,则它是非数字字符串并将转换为0。这并不意味着数字字符串必须以数字(0-9)开头 - 例如"-1"是一个数字字符串,因为在这种情况下减号是数字的一部分。

例如,您的字符串"d85d1d81b25614a3504a3d5601a9cb2e"不以数字开头,因此会转换为0。但是您的第二个字符串"3581169b064f71be1630b321d3ca318f"将转换为整数3581169。这就是为什么你的第二次测试不能以同样的方式工作的原因。

你应该做什么

你可能想要:

if ($test1 === "0")

注意使用triple equals而不是double equals。这可以确保您比较的是仅包含数字零的字符串,并阻止任何类型转换。

答案 2 :(得分:7)

经过一番调查后,结果发现,PHP手册中提到的是任何以数字开头的字符串在转换为整数时都会被转换为0。

这意味着:

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

非常讨厌,没有很好的记录。它位于类型比较页面上的注释的底部。

答案 3 :(得分:2)

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";

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

$test2 = "3581169b064f71be1630b321d3ca318f";

此字符串以3581169开头,这是一个有效数字,因此var将解析为该值不等于0。 所以你的测试#2不会通过。

答案 4 :(得分:1)

我一直在使用一些转换和比较来测试数字字符串是否为数字:

$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