[英]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.