2016-11-17 6 views
-2

これは非常に簡単な質問ですが、PHPでこれをどのように行うことができるか教えてください。PHP:JSONツリーの構文解析

私は私が解析する必要が次のようなJSON構造を持っている:

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

そして、それが生産、うまく動作します:

私はこれを行う、Xノードの内容を取得するには

{ 

    "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" 
      } 
     ] 

    } 

} 

CONTENT OF X 

また、私はこれを行うことによって、すべての「件名」すべて「EMAILS」のノードを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

あなただけの質問のような最初のoccuranceは、あなたが

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

RESULT行うことができます示唆している場合:あなたは、内部配列のすべての回出たい場合は

を行うことができますそれ以外の場合は

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

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

こんにちは@RiggsFolly、もう1つ質問してもらえますか?どのように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; 
} 

これを試してください。