簡體   English   中英

如何在PHP 5.4中檢查多維JSON數組中是否存在訪問路徑?

[英]How to check in PHP 5.4 if an access path exists in a multidimensional JSON array?

我想訪問由json_encode生成的數組中的元素,並希望確保該元素存在。 要取消警告(如果不存在),我使用@ Prior:

1)當數組中的訪問路徑存在時,所有工作均按預期進行

$test = @$obj['tag']    
// result is "ABCD" if "ABCD" set, "" if "" and NULL if NULL => as 

預期

2)當數組中的訪問路徑僅部分存在時,字符串會引起問題

$test = @$obj['tag']['dddd'] 
// = "A" when ['tag'] = "ABCD", I understand that 'dddd' becomes an index of 0 in the array representing the string. 

有什么辦法可以避免這種情況?

在嘗試過isset / is_scalar / is_null /空之后,我得出了從JSON數據生成的多維數組的followig結論:

1)isset()不能區分具有現有鍵和不存在鍵的值“ null”(我使用@作為禁止警告的訪問路徑)。 “”字符串可以很好地處理。

2)如果訪問路徑包含字符串,則存在一個異常。 在這種情況下,字符串的第一個字符將是結果。 字符串后面有多少個維度都沒有關系。 將始終引用字符串數組的0索引。

為了避免出現任何問題,我現在要做的是:1)在JSON中不使用null,無論如何都是個好主意。 2)避免使用單個字符的字符串。 如果需要,可以使用布爾值true / false代替Y / N。

測試數據:

isset is_scalar is_null empty access path value TRUE TRUE FALSE FALSE @$obj['tag']['dddd']['wwww'] A (not existing) TRUE TRUE FALSE FALSE @$obj['tag']['dddd'] A (not existing) TRUE TRUE FALSE FALSE @$obj['tag'] ABCD TRUE TRUE FALSE FALSE @$obj['tagf'] ABCD TRUE TRUE FALSE FALSE @$obj['user']['name'] Broemm TRUE TRUE FALSE FALSE @$obj['user']['num'] 1234 FALSE FALSE TRUE TRUE @$obj['user']['num']['dddd'] (not existing) TRUE TRUE FALSE TRUE @$obj['time']['b']['b'] “" FALSE FALSE TRUE TRUE @$obj['time']['c']['b'] null FALSE FALSE TRUE TRUE @$obj['tttt'] (not existing) TRUE TRUE FALSE FALSE @$obj['boo'] 1 FALSE FALSE TRUE TRUE @$obj['tttt'] (not existing) FALSE FALSE TRUE TRUE @$obj['boo']['qq'] (not existing) FALSE FALSE TRUE TRUE @$obj['boo']['qq']['ee'] (not existing)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM