【问题标题】:How to iterate over nested arrays?如何迭代嵌套数组?
【发布时间】:2025-12-28 21:55:18
【问题描述】:

这是我所拥有的:

$nav = array (
    "page 1" => array (
        "page 1.1" => array (
            "page 1.1.1"
            "page 1.1.2"
        ) ,
        "page 1.2"
    )
    "page 2" => array (
        "page 2.1"
    )
);

这就是我想要的:

<nav>
    <ul>
        <li>page 1
            <ul>
                <li>page 1.1
                    <ul>
                        <li>page 1.1.1</li>
                        <li>page 1.1.2</li>
                    </ul>
                </li>
                <li>page 1.2</li>
            </ul>
        </li>
        <li>page 2
            <ul>
                <li>page 2.1</li>
            </ul>
        </li>
    </ul>
</nav>

到目前为止我所拥有的:

foreach ($nav as $key => $val) {
    if (!is_numeric($key)) {
        $nav_entry = $key;
    } else {
        $nav_entry = $val;
    }
    echo "<li>" . $nav_entry . "</li>";
}

我的问题是,如果有子数组,我需要有那个 foreach 循环。最重要的是,我需要以某种方式适应if 语句以添加&lt;ul&gt;&lt;/ul&gt; 标记...

我开始看到星星……太混乱了。

【问题讨论】:

  • “家”在哪里适合您的输出?
  • @RobertCathey 对不起!这只是我在实际页面上工作的困惑。 > > 删除它。
  • 我几乎拥有它。只是遇到了一个奇怪的问题。
  • 知道了。将完全递归地工作。
  • 向所有人致敬!经过测试,它们都有效。只选择了编码最短且最容易阅读的那个...@@;;

标签: php arrays if-statement multidimensional-array foreach


【解决方案1】:

试试看:)

function createMenu($nav){
    echo "<ul>";
    foreach($nav as $key => $row){
        if(!is_array($row)){
            echo "<li>".$row."</li>";
        }else{
            echo "<li>".$key;
                createMenu($row);
            echo "</li>";

        }
    }
    echo "</ul>";
}

createMenu($nav);

【讨论】:

    【解决方案2】:

    试试

    <?php
    $nav = array (
        "page 1" => array (
            "page 1.1" => array (
                "page 1.1.1",
                "page 1.1.2"
            ),
            "page 1.2"
        ),
        "page 2" => array (
            "page 2.1"
        )
    );
    
    function drawRecursive($list){
        echo "<ul>";
        foreach ($list as $key=>$item){
            echo "<li>";
            if (is_array($item)){
                echo $key;
                drawRecursive($item);
            } else {
                echo $item;
            }
            echo "</li>";
        }
        echo "</ul>";
    }
    
    echo "<nav>";
    drawRecursive($nav);
    echo "</nav>";
    ?>
    

    【讨论】:

      【解决方案3】:
      $array = [
          'home',
          'page 1' => [
              'page 1.1' => [
                  'page 1.1.1',
                  'page 1.1.2'
              ],
              'page 1.2'
          ],
          'page 2' => [
              'page 2.1'
          ]
      ];
      
      function buildLists($array) {
          $result = '';
          foreach($array as $key => $value) {
              if(!is_int($key)) {
                  $result .= '<li>' . $key;
              } else if(!is_array($value)) {
                  $result .= '<li>' . $value;
              }
              if(is_array($value)) {
                  $result .= '<ul>';
                  $result .= buildLists($value);
                  $result .= '</ul>';
              } else {
                  $result .= '</li>';
              }
          }
          return $result;
      }
      

      用法:

      <nav>
         <ul>
             <?= buildLists($array); ?>
         </ul>
      </nav>
      

      输出:

      <li>home</li>
      <li>page 1
          <ul>
              <li>page 1.1
                  <ul>
                      <li>page 1.1.1</li>
                      <li>page 1.1.2</li>
                  </ul>
              </li>
              <li>page 1.2</li>
          </ul>
      </li>
      <li>page 2
          <ul>
              <li>page 2.1</li>
          </ul>
      </li>
      

      【讨论】: