2012-02-13 76 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