【问题标题】:PHP Foreach Tree AlternativesPHP Foreach 树的替代品
【发布时间】:2017-11-09 09:01:06
【问题描述】:

这是解析 JSON 时在我的工作流程中常见的 foreach 树,但我不禁想到有更好的方法。我试着查了一下,发现有些人指的是array_walk,但我不明白这将如何消除在foreach 中的foreach 中执行foreach 的需要。有什么帮助吗?如果有更好的方法,我很想学习,因为这并不总是很方便,而且感觉很混乱。

根据 cmets 的要求,预期结果是为每个学位生成一个页面,但该页面的模板将使用 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"
            }
          }
        }
      }
    }
  }
}

【问题讨论】:

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

标签: php json foreach


【解决方案1】:

不确定这是否适合整体,但它会按顺序递归提取 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
)

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2010-11-02
    • 2016-10-17
    • 2011-05-29
    相关资源
    最近更新 更多