2016-11-17 102 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; 
} 

请试试这个。