本帖最后由 XingGuangYingYing 于 2013-04-15 08:18:54 编辑

解决方案 »

  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.   

    你边查询边输出,于是你就无法知道当前节点是否有子节点(因为还未读到)
    所以你需要想将查询结果读到数组 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 动态加载的,所以没有递归。
    至少目前不适合你