如何使用PHP构建多级导航

时间:2012-08-26 18:44:47

标签: php html arrays navigation html-lists

我正在研究原型,并希望构建一个多级导航 - 但不是通过循环数组。我有一个$ depth和一个$ children,它应该确定导航的深度和每个级别的孩子数量。所以$ depth = 4,$ children = 8会产生4096个菜单项。

这是我希望输出的片段:

<ul>
    <li class="level-1">
        <a href="#">Subject 1</a>
        <ul>
            <li class="level-2">
                <a href="#">Subject 1.1</a>
                <ul>
                    <li class="level-3">
                        <a href="#">Subject 1.1.1</a>
                    </li>
                    ...
                </ul>
            </li>
            ...
        </ul>
    </li>
    ...
</ul>

到目前为止,我已经尝试了这个,但我无法理解它:(

function draw_list ($depth, $children) {

  echo '<ul>';

  for ($i = 0; $i < $children; $i++) {

    echo '<li>' . ($i++);

    $depth--;

    if ($depth > 0) {

      echo draw_list($depth, $children);

    }

    echo '</li>';

  }

  echo '</ul>';


}

2 个答案:

答案 0 :(得分:0)

我看到了几件事......

  • $depth--;需要超出for循环
  • 您正在$i两次递增,一次在for语句中,然后再次在echo '<li>' . ($i++);
  • $ deep深度检查提前停止,因此请>=而不是> 编辑,考虑一下,这是不正确的陈述)

那应该给你......

function draw_list ($depth, $children) {  
  echo '<ul>';
  $depth--;
  for ($i = 0; $i < $children; $i++) {
    echo '<li>' . $i;
    if ($depth > 0) {
      echo draw_list($depth, $children);
    }
    echo '</li>';
  }
  echo '</ul>';
}

<强>更新

要显示级别编号,请尝试将字符串值作为参数传递...

function draw_list ($depth, $children, $display=''){  
  echo '<ul>';
  $depth--;
  for ($i = 0; $i < $children; $i++) {
    echo '<li>' . $display . ($i + 1);
    if ($depth > 0) {
      echo draw_list($depth, $children, $display . ($i + 1) . '.');
    }
    echo '</li>';
  }
  echo '</ul>';
}

答案 1 :(得分:0)

我最终这样做了:

function build_nav ($depth, $children, $levels = array()) {

    echo '<ul>';
    $depth--;
    for ($i = 0; $i < $children; $i++) {

        $levels[$depth] = $i+1;

        echo '<li>';
        echo 'Subject: ' . implode('.', $levels); 

        if ($depth > 0) {
            build_nav($depth, $children, $levels);
        }
        echo '</li>';
    } 
    echo '</ul>';
}