2012-02-03 59 views
2

我有以下陣列稱爲$fruits與isset()函數爲數組鍵返回true奇怪的行爲不存在

Array 
(
    [response] => Array 
     (
      [errormessage] => banana 
     ) 

    [blah] => Array 
     (
      [blah1] => blahblah1 
      [blah2] => blahblah2 
      [blah3] => blahblah3 
      [blah4] => blahblah4 
     ) 

) 

然而,當我這樣做:

isset($fruits['response']['errormessage']['orange']) 

它返回

究竟會造成這樣一種奇怪的行爲,我該如何解決這個問題?

謝謝!

回答

6

[n]也訪問字符串中的字符的方式:

$fruits['response']['errormessage']['orange'] 
== 
$fruits['response']['errormessage'][0] // cast to int 
== 
b (the first character, at position 0) of 'banana' 

使用array_key_exists,可能結合is_array

11

它只是歸結爲PHP的瘋狂類型系統。

$fruits['response']['errormessage']是字符串'banana',所以您試圖通過['orange']索引訪問該字符串中的字符。

將字符串'orange'轉換爲整數用於索引,因此它變爲0,如$fruits['response']['errormessage'][0]中所示。字符串的第0個索引是字符串的第一個字符,所以對於非空字符串,它基本上是設置的。因此isset()返回true。

我不知道你想要做什麼,所以我不能提供任何「修復」。這是設計。

+3

使用array_key_exists(),盧克。 – St0rM 2012-02-03 17:27:43

+0

@ St0rM:True ...假設'$ fruits ['response'] ['errormessage']'應該是一個數組,它顯然不是,但*可能是*;) – BoltClock 2012-02-03 17:28:31

+1

我認爲是他試圖測試'$ fruits ['response'] ['errormessage'] ['orange']'作爲關鍵的存在,這是我能想到的唯一原因可以讓他驚訝於結果。由於該鍵不存在,他期待'錯誤'。但我可能是錯的。 – St0rM 2012-02-03 17:32:16

0

修復

if (is_array($fruits['response']['errormessage']) 
    && isset($fruits['response']['errormessage']['orange'])) { .. }