2016-11-17 122 views
-2

這將是非常簡單的問題,但請讓我知道我可以在PHP中做到這一點。PHP:解析JSON樹

我有以下的JSON結構,我需要解析:

{ 

    "X": "CONTENT OF X", 
    "Y": "CONTENT OF Y", 
    "Z": "CONTENT OF Z", 

    "EMAILS": { 

     "EMAIL A": [{ 
       "Subject": "heading a1", 
       "Body": "text" 
      }, { 
       "Subject": "heading a2", 
       "Body": "text" 
      } 
     ], 
     "EMAIL B": [{ 
       "Subject": "heading b1", 
       "Body": "text" 
      }, { 
       "Subject": "heading b2", 
       "Body": "text" 
      } 
     ], 
     "EMAIL C": [{ 
       "Subject": "heading c1", 
       "Body": "text" 
      }, { 
       "Subject": "heading c2", 
       "Body": "text" 
      } 
     ] 

    } 

} 

要獲得X節點的內容,我這樣做:

$string = file_get_contents($url); 
$json = json_decode($string, true); 
echo $json['X']; 

這工作得很好,生產:

CONTENT OF X 

我也可以FING所有「主題」所有「電子郵件」功能的節點,這樣做:

foreach ($json['EMAILS'] as $value) { 
echo $value[0]['Subject'] 
} 

所以我得到:

heading a1 
heading b1 
heading c1 

不過,我不知道如何通過EMAIL陣列迭代,所以它產生的只是標題的下面的列表:

EMAIL A 
EMAIL B 
EMAIL C 

而且這將非常有助於瞭解如何把它結合在一起,所以我得到以下的輸出:

EMAILS - EMAIL A - Subject - heading a1 
EMAILS - EMAIL B - Subject - heading b1 
EMAILS - EMAIL C - Subject - heading c1 
+0

你真的只想內陣列即中第一次出現'標題a1',而不是所有的人即'標題a1'和'航向a2' – RiggsFolly

回答

1

如果你只想要一個像你的問題第一次出現提示,那麼你可以做

foreach ($json['EMAILS'] as $name => $emails) { 
    echo sprintf("EMAILS - %s %s\n", $name, $emails[0]['Subject']); 
} 

結果:

EMAILS - EMAIL A heading a1 
EMAILS - EMAIL B heading b1 
EMAILS - EMAIL C heading c1 

否則,如果你想內陣列的所有occurances你可以做

foreach ($json['EMAILS'] as $name => $emails) { 
    foreach ($emails as $email) { 
     echo sprintf("EMAILS - %s %s\n", $name, $email['Subject']); 
    } 
} 

結果:

EMAILS - EMAIL A heading a1 
EMAILS - EMAIL A heading a2 
EMAILS - EMAIL B heading b1 
EMAILS - EMAIL B heading b2 
EMAILS - EMAIL C heading c1 
EMAILS - EMAIL C heading c2 
+0

這正是我需要的。非常感謝你,你救了我的一天。 – jjj

+0

Hi @RiggsFolly,我可以再問你一個問題嗎?我如何獲得EMAILS節點數組中的孩子數?在這種情況下,它等於3(EMAIL A,EMAIL B&EMAIL C)。你如何在PHP中做到這一點?我可以在foreach上設置一個計數器並按照這種方式執行,但我不想遍歷整個數組以獲取計數。有什麼更好的方法呢? – jjj

+0

你可以在任何數組上使用'count()'。所以你可以做'count($ json ['EMAILS'])' – RiggsFolly

1
$emailArray=array(); 
forecach($json['EMAILS'] as $key=>$tempValues){ 
    $emailArray['EMAILS'][]= $key.' - Subject -'.$tempValues['Subject']; 
} 
//print_r($emailArray); 

foreach($emailArray as $key=>$value){ 
    echo $value; 
} 

請試試這個。