2012-08-10 33 views
1

即使是相對清楚地意識到PHP特殊性,下面strange behaviour仍然讓我感到困惑的今天:PHP array_key_exists - 鬆對某些類型的,嚴格的另一

// loose 
$a = array(true => 'foo'); 
var_dump(array_key_exists(1, $a)); 

// strict 
$a = array('7.1' => 'foo'); 
var_dump(array_key_exists('7.10', $a)); 

我想這可能是這種影響的技術原因,所以問題是,這個函數背後的過程是什麼造成某些類型的值比較鬆散,而其他類型則嚴格地進行比較?我並不抱怨這種行爲,但試圖理解這一點,所以「PHP糟糕」評論沒有意義。

+0

數組鍵總是被轉換爲整數。我以爲你會被'echo'7.1'=='7.10';';) – meze 2012-08-10 16:45:21

+0

弄糊塗我不確定你認爲什麼是奇怪的...... – BenOfTheNorth 2012-08-10 16:45:34

+0

也許你可以在那裏添加腳本輸出?第一眼雖然:布爾作爲數組鍵?我不認爲這是ggonna以任何方式幫助!第二:7.10在7.1中不一樣 - 在''中聲明這使得它成爲一個字符串.... – Nick 2012-08-10 16:45:46

回答

3

在第一種情況下,布爾值不是有效的數組鍵,所以當您初始化數組時,它會立即變爲1,從而使您的搜索匹配。

在第二個情況下,數組鍵是一個字符串,和「7.1」不相同的字符串爲「7.10」

+0

儘管'true'不是一個有效的數組鍵,如果鍵是'1',它也會返回'true'。所以類型轉換確實發生。 – 2012-08-10 16:57:51

+0

我認爲這是因爲PHP數組在關聯時會像HashMap:IE那樣處理,所有的字符串都會轉換爲整數(字符串的哈希),然後由它查找。 – 2012-08-10 17:10:39

+0

@羅伯特:你可能是對的。你不能有一個既有'1'又有'1'作爲鍵的數組,所以內部映射到相同的值。 – 2012-08-10 17:20:34

1

在第二個例子中,'7.1''7.10'都是字符串。他們被比較爲字符串,所以他們不匹配。

現在爲什麼你在第一個例子中有一個匹配?數組鍵可以是字符串或整數。因此true被轉換爲整數,其計算結果爲1

0

也許你可以在那裏添加腳本輸出?第一眼雖然:布爾作爲數組鍵?我不認爲這會以任何方式幫助!第二:7.10在7.1中不一樣 - 在''中聲明這使得它成爲一個字符串....

如果你想要true作爲一個鍵名,那麼你需要用單引號或雙引號封裝它。如果你不知道PHP和單/雙引號,它會導致內容被視爲一個字符串值而不是布爾整數(真/假)

1

這是here。請注意,鍵是整數或字符串。在文檔中提到了特定的關鍵演員,特別是(對於您的情況)bools被轉換爲整數(即​​true as 1和false as 0)。如別處所述,您的其他示例是字符串(刪除引號以使它們浮動,然後按照文檔將其截斷爲整數)。