递归目录树,怎样套上UL LI

时间:2023-01-26 12:32:46
function nav($parent){
$sql = mysql_query("select * from menu where parent = '$parent'");
while($row = mysql_fetch_array($sql)){
echo '<li><a href="'.$row['id'].'">'.$row['name'].'</a>';
nav($row['id']);
echo '</li>';

}
}

子类要怎么套上UL输出呢?   

类似这样

<ul id=nav>
<li><a>音乐</a>
     <ul><li><a>流行</a></li>
         <li><a>经典</a>
              <ul>
              <li><a>80年代</a></li>
              <li><a>90年代</a></li>
              </ul>
          </li>
     </ul>
</li>
<li><a>电影</a></li>
<li><a>书籍</a></li>
</ul>

5 个解决方案

#1


function nav($parent){
  $sql = mysql_query("select * from menu where parent = '$parent'");
  while($row = mysql_fetch_array($sql)){
    echo '<li><a href="'.$row['id'].'">'.$row['name'].'</a>';
    echo '<ul>';
    nav($row['id']);
    echo '</ul>';
    echo '</li>';
  }
}

由于你在 nav 函数中是直接输出的,所以在没有子节点时,会产生空的 <ul></ul>
不过并不影响显示效果

#2


就是会影响啊  我前端是折叠菜单  UL  display为block的时候就麻烦了 

网上找了一夜  中文英文  测试无数   就没有一个完美的   要么连数据库封装成类没法用  要么UL嵌套错误

要么遍历N次   要么几百行代码    看着都笨拙 


不知道大牛们是怎么解决的,就没有一个完美的办法?   

#3


请版主老大把你常用的代码分享下

#4


你边查询边输出,于是你就无法知道当前节点是否有子节点(因为还未读到)
所以你需要想将查询结果读到数组  http://bbs.csdn.net/topics/390364669
然后再递归输出

你也可以用变量缓存待输出的内容,等递归结束时再输出
function nav($parent){
  $res = '';
  $sql = mysql_query("select * from menu where parent = '$parent'");
  while($row = mysql_fetch_array($sql)){
    $res .= '<li><a href="'.$row['id'].'">'.$row['name'].'</a>';
    $t = nav($row['id']);
    if(! empty($t)) $res .= "<ul>$t</ul>";
    $res .= '</li>';
  }
  return $res;
}

调用时
echo nav($id);

我都是用 ajax 动态加载的,所以没有递归。
至少目前不适合你

#5


非常感谢,我慢慢去研究吧

#1


function nav($parent){
  $sql = mysql_query("select * from menu where parent = '$parent'");
  while($row = mysql_fetch_array($sql)){
    echo '<li><a href="'.$row['id'].'">'.$row['name'].'</a>';
    echo '<ul>';
    nav($row['id']);
    echo '</ul>';
    echo '</li>';
  }
}

由于你在 nav 函数中是直接输出的,所以在没有子节点时,会产生空的 <ul></ul>
不过并不影响显示效果

#2


就是会影响啊  我前端是折叠菜单  UL  display为block的时候就麻烦了 

网上找了一夜  中文英文  测试无数   就没有一个完美的   要么连数据库封装成类没法用  要么UL嵌套错误

要么遍历N次   要么几百行代码    看着都笨拙 


不知道大牛们是怎么解决的,就没有一个完美的办法?   

#3


请版主老大把你常用的代码分享下

#4


你边查询边输出,于是你就无法知道当前节点是否有子节点(因为还未读到)
所以你需要想将查询结果读到数组  http://bbs.csdn.net/topics/390364669
然后再递归输出

你也可以用变量缓存待输出的内容,等递归结束时再输出
function nav($parent){
  $res = '';
  $sql = mysql_query("select * from menu where parent = '$parent'");
  while($row = mysql_fetch_array($sql)){
    $res .= '<li><a href="'.$row['id'].'">'.$row['name'].'</a>';
    $t = nav($row['id']);
    if(! empty($t)) $res .= "<ul>$t</ul>";
    $res .= '</li>';
  }
  return $res;
}

调用时
echo nav($id);

我都是用 ajax 动态加载的,所以没有递归。
至少目前不适合你

#5


非常感谢,我慢慢去研究吧