2017-06-07 15 views
1

これは私のワークフローでJSONを解析する際によく見られるforeachツリーですが、より良い方法があるとは思えません。私はこれを調べようとしましたが、array_walkを参照している人がいましたが、foreach内でforeach内でforeachを実行する必要性を排除する方法はありません。どんな助け?もっと良い方法があれば、私はいつも便利ではないと思うので、勉強が大好きです。PHP Foreach Tree Alternatives

コメントで要求されているように、予想される結果は各程度のページを生成することですが、そのページのテンプレートはforeachツリー(および私が含まなかった他のもの)からのすべての名前変数を使用します。私は、私のユースケースがどのように質問に答えるかに影響を与えることができるので、私はその情報を追加したので、サンプルを単純に保つためにPHPを取り除いた。ここで

foreach ($programs as $program) { 
    $program_name = $program['name']; 
    $degrees = program['degrees']; 
    foreach ($degrees as $degree) { 
    $degree_name = $degree['name']; 
    $courses = $degree['courses']; 
    foreach ($courses as $course) { 
     $course_name = $course['name']; 
     echo $course_name; 
    } 
    } 
} 

JSONです:ここで

は、配列を解析するために、いくつかのPHPです

{ 
    "programs":{ 
    "undergraduate":{ 
     "name":"undergraduate", 
     "degrees":{ 
     "elementary education":{ 
      "name":"elementary education", 
      "courses":{ 
      "math":{ 
       "name":"math" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+2

最初の入力と期待される結果を表示 – RomanPerekhrest

+0

Hey RomanPerekhrest、より具体的な例で質問を更新しました。この状況では、階層を使用して各プログラム、度、コースのページを生成しました。私の例では、私は単純にそれを維持するために各コース名をecho'dします。 – BarryMode

+0

「コース」名のみを出力しますか? – RomanPerekhrest

答えて

2

ない、これは全体的にどのように適合するかを確認しますが、それは再帰的に順番にname項目を抽出します。

$result = array(); 
array_walk_recursive($array, function($v, $k) use(&$result) { 
           if($k == 'name') { $result[] = $v; } 
          }); 

print_r($result); 

収量:

Array 
(
    [0] => undergraduate 
    [1] => elementary education 
    [2] => math 
)