2011-12-13 29 views
1

我正面臨一個奇怪的PHP問題。這個簡單的例子:

<?php 
$array = array(
    'zero', 
    'one', 
    'id' => 'two' 
); 

foreach ($array as $key => $value) { 
    if ($key == "id") { 
    echo "Key: ". $key .", value: ". $value ."\n"; 
    } 
} 
?> 

應(恕我直言)輸出這樣的:

Key: id, value: two 

但它輸出

Key: 0, value: zero 
Key: id, value: two 

這怎麼可能:0 == "id"

+0

你有沒有試過它與一個嚴格的比較(`===`)? – jprofitt 2011-12-13 20:24:13

+0

它應該給你「鑰匙:0,價值:零......」雖然,是一個錯字呢? http://codepad.org/qGfe1jNC。 – 2011-12-13 20:25:26

回答

6

$鍵0並得到比較字符串 「ID」,字符串( 「ID」)將被轉換爲整數。由於「id」不能轉換爲有效整數,轉換將產生0,並且if語句變爲true。

由於您不希望在不兼容的兩種類型之間發生隱式轉換,因此請使用更嚴格的===版本=====將查看變量是否具有相同的類型並具有相同的確切值。

if ($key === "id") { 
    ... 
} 

文檔PHP: Comparison Operators


實例

var_dump (0   == (int)"id"); 
var_dump ((string)0 == "id"); 
var_dump (0  === "id"); 

var_dump (1.0 === 1); 

輸出

bool(true) 
bool(false) 
bool(false) 
bool(false) # be careful! 
3

您正在被咬傷一個叫做type juggling的過程。

嘗試以下操作:

var_dump(0 == "id"); 

它將輸出bool(true)

PHP正在執行整數比較,當它試圖將字符串"id"轉換爲整數時,結果爲0。 PHP會高興地解析字符串的前導數字,並停止在第一個非數字值處,產生像「123xyz」這樣的字符串的整數123。由於字符串"id"中沒有前導數字,因此將其解析爲整數0

解決方法是使用===,它比較兩個變量的值類型,而不嘗試操縱操作數的類型。

-1

如果將邏輯表達式考慮到VARTYPE

if (key === "id") 

如果將工作。就像@refp說的。

0

此:

$key == 'id' 

...將使PHP做整數比較,因爲左值是一個整數。

如果你想知道爲什麼這樣的:

if ($key) { ... } 

...不會產生相同的結果,那麼這是因爲這裏的左值(而略)是布爾值,相當於:

if (true == $key) { ... } 

因此,PHP會嘗試進行布爾比較。您可以使用===運算符來強制進行類型檢查。可以參考Type Comparison TablesComparison Operators Table