2012-02-13 86 views
6

我正在处理一些数据解析代码,但遇到以下情况。奇怪的PHP字符串整数比较和转换

$line = "100 something is amazingly cool"; 
$key = 100; 

var_dump($line == $key); 

那么我们大多数人会想到倾倒产生false,但让我吃惊的是转储是true

我也明白,在PHP中存在类型转换这样的:

$x = 5 + "10 is a cool number"; // as documented on PHP manual 
var_dump($x); // int(15) as documented. 

但是,为什么像我在第一个例子是如何提到的比较转换我的字符串,而不是整数,那么整数转换为字符串。

我不明白,你可以做一个===严格,比较我的例子,但我只是想知道:

  • 有PHP文档提这种行为的任何部分?
  • 任何人都可以解释为什么PHP中发生?
  • 程序员如何防止这种问题?
+0

==数字比较我认为,当你把它和字符串,并将它转换为数字,如果它以数字开头,它使用该数字。如果它不会像NaN那样返回。 – rubixibuc 2012-02-13 08:53:55

+0

我们大多数人会期望这....当将一个字符串转换为一个整数(比较字符串与数字时发生的情况)时,PHP会停在它遇到的第一个非数字数字处,在这种情况下为100(所有数字)和“某些东西”之间的空格。 SO 100是结果值。 – 2012-02-13 08:54:17

+0

请参阅http://stackoverflow.com/a/8672423 – Gumbo 2012-02-13 08:54:55

回答

4

如果我正确回忆PHP'将'两个变量转换为尽可能低的类型。 他们称之为类型杂耍。

尝试:var_dump("something" == 0); 例如,那会给你真实的。 。我以前曾经咬过一次。

更多信息:http://php.net/manual/en/language.operators.comparison.php

+0

The PHP手册现在描述了http://php.net/manual/en/language.types.type-juggling.php中的类型玩杂耍,然后链接到一个关于字符串转换为http://php.net/manual /en/language.types.string.php#language.types.string.conversion – 2015-10-02 14:30:28

1

我知道这已经回答和接受,但我想补充一点,就是可以帮助别人谁通过搜索找到。

当我比较后数组与PHP数组中的键时,我有同样的问题,在我的后数组中,我有一个额外的字符串值。

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==$key){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

由此你会认为在年底$foo[0]["bar"]将等于"0"但正在发生的事情是,当$key = int 0$bar = string "other"松散比较结果是true来解决这个问题,我公司严格比较,但随后需要到$key = int 0转换成$key = string "0"用于当POST阵列定义为array("other","0");以下工作:

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==="$key"){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

结果是$foo[0]["bar"]="1"如果"0"在POST栏列阵中,$foo[0]["bar"]="0"如果"0"不在POST栏列表中。

请记住,当比较由于PHP的松散变量键入而导致您的变量未被比较的变量时。

+0

也许这只是我,但是你的例子太过于复杂了。这个问题似乎是你将'$ foo'定义为嵌套在常规数组中的关联数组,然后使用关联数组表达式'($ key => $ data)'来解析常规数组。如果您必须在数据中嵌套这个嵌套,为什么不将该嵌套嵌套在另一个可以处理常规数组的嵌套中呢? – 2015-10-31 14:23:45