现在有一个无限分级系统 利用 前序遍历    的数据表   字段  id name lft  rgt nlevel
在thinkphp框架下  怎么才能实现 遍历输出  

解决方案 »

  1.   

    直接遍历啊……
    这和thinkphp有啥关系……
      

  2.   

    和thinkphp没什么关系   我只是希望 回答的大神能在这个框架下实现
    然后 遍历结果是要 实现图一的效果  简而言之 就是 子节点要在父节点底下  而不是简单的遍历
      

  3.   

    在这个框架下的实现和在其他框架下的实现最多就差个查询语句…………
    你在csdn里面搜索一下左右值无限分类,有很多参考的
      

  4.   

    xuzuning  没理解我的意思 
    图一才是我想实现的效果   图二只是 说 这个无线分类的 解释
    现在有个  数据表  是根据图二  储存的   我想把它遍历出来 但不是简单遍历   
    如 图一 所示  使他们的子类别放在相对应父类下面  并且缩进两格  
      

  5.   

    win2003 sp2 拒绝访问 解决方法win2003 sp2 拒绝访问 解决方法win2003 sp2 拒绝访问 解决方法
      

  6.   

    预排序遍历树这不是很简单吗?SELECT ……  lft BETWEEN (… AND …) ORDER BY lft ASCbetween范围,就是某个节点的左右值。。而你的字段nlevel【与某个节点nlevel的差】就是缩进长度
    这种结构,找出树结构非常容易。。也就为了解决这种需求而产生的但是改变父子关系、插入数据会麻烦一些。
      

  7.   

    嗯,是我理解错了
    $ar = array ( // 按 lft 升序获得的数组
      array ( 'id' => '1', 'name' => 'Food',   'lft' => '1',  'rgt' => '18', 'nlevel' => '0', ),
      array ( 'id' => '2', 'name' => 'Fruit',  'lft' => '2',  'rgt' => '11', 'nlevel' => '0', ),
      array ( 'id' => '3', 'name' => 'Red',    'lft' => '3',  'rgt' => '6',  'nlevel' => '0', ),
      array ( 'id' => '4', 'name' => 'Cherry', 'lft' => '4',  'rgt' => '5',  'nlevel' => '0', ),
      array ( 'id' => '5', 'name' => 'Yellow', 'lft' => '7',  'rgt' => '10', 'nlevel' => '0', ),
      array ( 'id' => '6', 'name' => 'Banana', 'lft' => '8',  'rgt' => '9',  'nlevel' => '0', ),
      array ( 'id' => '7', 'name' => 'Meat',   'lft' => '12', 'rgt' => '17', 'nlevel' => '0', ),
      array ( 'id' => '8', 'name' => 'Beef',   'lft' => '13', 'rgt' => '14', 'nlevel' => '0', ),
      array ( 'id' => '9', 'name' => 'Pork',   'lft' => '15', 'rgt' => '16', 'nlevel' => '0', ),
    );function show_callback($val) {
      global $st;
      while(isset($st[0]) && $st[0] < $val['rgt']) {
        array_shift($st);
      }
      array_unshift($st, $val['rgt']);
      $val['child'] = ($val['rgt'] - $val['lft'] - 1) / 2;
      $val['space'] = str_repeat(' ', count($st) - 1);
      return $val;
    }
    $st = array();
    $ar = array_map('show_callback', $ar); //忽略nlevel的作用,自行计算缩进foreach($ar as $v) {
      echo $v['space'] . $v['name'] . '<br>';
    }Food
     Fruit
      Red
       Cherry
      Yellow
       Banana
     Meat
      Beef
      Pork
      

  8.   

    现在在看xuzuning的代码   
    我先说一下 mu_rain    你没理解清除意思   我要的是遍历  你总不能一个个写那个sql语句吧
      

  9.   

    说错了  不是  mu_rain  是 amani11 
      

  10.   

    既然存在数据库,你别的方式不要通过数据库查询吗?那一条SQL语句,直接将树结构搜出来了。否则为啥叫“预排序”呢?
      

  11.   

    谢谢xuzing  对我的提醒  
    其实直接将从数据库查询出数据 然后按lft升序排列   这样子类别就肯定在相应父类别下面  然后在根据nlevel相应的缩进就可以  
    图一是数据表   图二是输出结果
    <?php
    $link=mysql_connect('localhost','root','123456') or die('不能连接'.mysql_error());
    $sql=mysql_query('use db_review',$link);$result=mysql_query("select * from wk_subcat order by lft",$link);
    while($ar=mysql_fetch_array($result))
    {
    for($i=0;$i<$ar['nlevel'];$i++) echo '&nbsp;&nbsp;&nbsp;&nbsp;';
    echo $ar['name'].'<br />';
    }
    ?>