Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Foreach树替代方案_Php_Json_Foreach - Fatal编程技术网

PHP Foreach树替代方案

PHP Foreach树替代方案,php,json,foreach,Php,Json,Foreach,这是一个foreach树,在解析JSON时在我的工作流中很常见,但我忍不住认为有更好的方法。我试着查找这个,我发现一些人提到array_walk,但我不认为这会消除在foreach内部foreach内部foreach的需要。有什么帮助吗?如果有更好的方法,我很想学习,因为这并不总是很方便,而且感觉很混乱 按照注释中的要求,预期结果是为每个学位生成一个页面,但该页面的模板将使用foreach树中的所有名称变量(以及我没有包含的其他一些变量)。我剥离了PHP以保持示例的简单性,尽管我知道我的用例可能

这是一个foreach树,在解析JSON时在我的工作流中很常见,但我忍不住认为有更好的方法。我试着查找这个,我发现一些人提到array_walk,但我不认为这会消除在foreach内部foreach内部foreach的需要。有什么帮助吗?如果有更好的方法,我很想学习,因为这并不总是很方便,而且感觉很混乱

按照注释中的要求,预期结果是为每个学位生成一个页面,但该页面的模板将使用foreach树中的所有名称变量(以及我没有包含的其他一些变量)。我剥离了PHP以保持示例的简单性,尽管我知道我的用例可能会影响问题的答案,所以这就是我添加该信息的原因

下面是一些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:

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

不确定这是否符合总体要求,但它会按顺序递归提取
名称
项:

$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
)

在显示初始输入和预期结果之前,我用一个更具体的例子更新了我的问题。在这种情况下,我使用层次结构为每个课程、学位和课程生成一个页面。虽然在我的示例中,我只是简单地回显每个课程名称以保持简单。是否只输出“课程”名称?更容易使用有效的JSON。抱歉,Abracadver,我使用有效的JSON更新了。我当场写了这个假设,虽然我会实现任何可能的答案,如果有一个。在这种情况下,我会为每个学位生成一个页面,使用该页面上所有课程、学位、课程的名称。我有办法做到这一点,我只是想知道是否有一个更好的方法比做foreach树。