mysql数据,pid里存放的是上级目录的id号。
id name pid
1   a    0
2   b    1
3   c    2
4   e    1
5   f    1
6   g    2
7   h    3
8   i    1
9   j    3
10  k    6
11  d    8
12  l    5 需要按如下的树型排列,请高手指导,谢谢!

解决方案 »

  1.   

    我刚写了一个,是用面向对象做的,给你参考下:
    <?php
    abstract class CateTree extends MyDb {
    protected $sort_i = 0; //
    protected $child_sort; //子分类
    // ==========================================
      // 作用:按格式将商品分类信息保存到&$streelist
      // 参数:$streelist,保存的结果(数组)
    // 返回:无
    // ==========================================
    function TreeMenu(&$treelist)
    {
    //如果第一次运行,首先获得第一级分类
    if($this->sort_i == 0){
    $sql = "SELECT * FROM `{$this->tabName}` WHERE `pid`='0'";
    $result = $this->mysqli->query($sql);
    }else{
    $result = $this->child_sort;
    unset($this->child_sort);
    } //循环输出子菜单,当子菜单还有子菜单的时候,则递归调用先输出子菜单
    while($menu = $result->fetch_array()){
    //定义查询语句查询当前菜单下的子菜单
    $sql = "SELECT * FROM `{$this->tabName}` WHERE `pid`='{$menu['id']}'";
    $this->child_sort = $this->mysqli->query($sql); //如果不是第一次循环
    if($this->sort_i > 0){
    $fori=$forq=$this->sort_i;
    //检查父类缩进
    for($i=0;$i!=1;){
    if($menu['pid'] == $treelist[--$fori]['id']){
    $treelist[$this->sort_i]['in'] = $treelist[$fori]['in'] + 20; //在父类原有基础增加缩进20px
    $i = 1;
    }elseif($menu['pid'] == 0){
    $treelist[$this->sort_i]['in'] = 0; //顶级父类不缩进
    $i = 1;
    }
    }
    //计算html闭合标签数量
    if($treelist[--$forq]['in'] > $treelist[$this->sort_i]['in']){
    $_div_num = ($treelist[$forq]['in']-$treelist[$this->sort_i]['in'])/20; //需要多少个</DIV>标签对应<div>
    $treelist[$this->sort_i]['_div'] = $_div_num; //封子类到框架中
    }else{
    $treelist[$this->sort_i]['_div'] = 0; //不封子类到框架中
    }
    }else if($menu['pid']==0){
    $treelist[$this->sort_i]['in'] = 0; //顶级父类不缩进
    $treelist[$this->sort_i]['_div'] = 0; //不封子类到框架中
    }//end if if($this->child_sort->num_rows > 0){ //如果有子分类
    $treelist[$this->sort_i]['z'] = 1;
    foreach($this->fieldList as $v){
    $treelist[$this->sort_i][$v] = $menu[$v];
    }
    $this->sort_i++;
    //另外,如果有子菜单先继续递归调用,获得子分类
    $this->TreeMenu($treelist);
    }else{ //如果没有有子分类
    $treelist[$this->sort_i]['z'] = 0;
    foreach($this->fieldList as $v){
    $treelist[$this->sort_i][$v] = $menu[$v];
    }
    $this->sort_i++;
    }
    }
    } //=======
    // 另一种简单实现方法
    //=======
    protected function t($pid=0){
    if($result = $this->child_exists($pid)){
    echo("<ul>");
    while($rs = $result->fetch_row()){
    echo("<li>".$rs[1]."</li>\n");
    $this->t($rs[0]);
    }
    echo("</ul>");
    }
    }
    function runt(){
    $this->t();
    } // ========================================
    // 功能:指定$sort_id时获得上级分类
    // 参数:$sort_id-分类ID,$type-输出类型(mod:不含子类,all:全部)
    // 返回:$type=mod并且$sort_id!=0的时候返回$sort_id的父类为selected,并且不含$sort_id子类的分类
    // $type=all并且$sort_id!=0的时候返回$sort_id的父类为selected,的所有分类
    // 如果$sort=0则直接返回所有分类信息
    // ========================================
    function getParent($sort_id=0,$type='mod'){
    $sort = $this->findAll(); //获得数据库中所有分类信息
    if($sort_id!=0){
    if($type=='mod'){
    return $this->getNoChild($sort,$sort_id); //获得不包含$sort_id的子类和其自身的,把$sort_id的父类设置为selected
    }elseif($type=='all'){
    return $this->getAll($sort,$sort_id); //获得所有的分类,并且把$sort_id的父类设置为selected
    }
    }else{
    return $sort;
    }
    }
    // ===============================
    // 功能:获得不包含$sort_id子类和自己分类的分类信息,$sort_id的直接父类为selected
    // 参数:$sort[array],$sort_id[int]
    // 返回:不包含$sort_id的子类和自己的分类
    // ===============================
    protected function getNoChild($sort,$sort_id){
    if($sort_id==1){ //是顶级分类时返回顶级分类,并且id赋值为0
    $where = 'WHERE `id` = \'1\'';
      $sort = $this->findAll(array(),0,0,$where);
    foreach($this->fieldList as $v){
    if($v=='id'){
    $newsort[0][$v] = 0;
    }else{
    $newsort[0][$v] = $sort[0][$v];
    }
    }
    return $newsort;
    }
    foreach($sort as $k=>$v){
    //如果$v['id']不是$sort_id的子类
    if(!$this->is_child($sort_id,$v['id'])){
    if($v['id']==$this->getPID($sort_id)){ //如果是自己的父类添加selected
    foreach($v as $k2=>$v2){
    $newsort[$k+1][$k2] = $sort[$k][$k2];
    }
    $newsort[$k+1]['selected']='selected="selected"';
    }elseif($v['id']!=$sort_id){ //所属分类不包含自己
    foreach($v as $k2=>$v2){
    $newsort[$k+1][$k2] = $sort[$k][$k2];
    }
    $newsort[$k+1]['selected']='';
    }
    }
    }//foreach end
    return $newsort;
    }
    // ===============================
    // 功能:获得所有的分类信息,$sort_id为selected
    // 参数:$sort[array],$sort_id[int]
    // 返回:所有分类
    // ===============================
    function getAll($sort,$sort_id){
    foreach($sort as $k=>$v){
    if($v['id']==$sort_id){ //如果$v['id']是自己$sort_id的添加selected
    foreach($v as $k2=>$v2){
    $newsort[$k+1][$k2] = $sort[$k][$k2];
    }
    $newsort[$k+1]['selected']='selected="selected"';
    }else{
    foreach($v as $k2=>$v2){
    $newsort[$k+1][$k2] = $sort[$k][$k2];
    }
    $newsort[$k+1]['selected']='';
    }
    }//foreach end
    return $newsort;
    }
    // ===============================
    // 功能:多层关系判断$id2是否是$id1的子类
    // 参数:$id1[int],$id2[int]
    // 返回:如果$id2是$id1的子类返回真,否则返回假
    // ===============================
    protected function is_child($id1,$id2){
    $pid = $this->getPID($id2); if($pid==$id1){
    return true;
    }elseif($pid==0){
    return false;
    }else{
    $this->is_child($id1,$pid); //递归判断id2的父类是否是$id1的子类
    }
    } // ==============================
    // 获得上级分类的ID
    // 参数:当前分类ID
    // 返回:pid
    // ==============================
    protected function getPID($id){
    $where = "WHERE `id`='".$id."'";
    $sort = $this->findAll(array('pid'),0,0,$where);
    return $sort[0]['pid'];
    }
    // ==============================
    // 功能:获得传递来ID的分类信息名称
    // 参数:当前分类ID
    // 返回:当前ID分类
    // ==============================
    function getCateName($id,$filedname){
    $where = "WHERE `id`='{$id}'";
    $cate = parent:: findAll(array($filedname),0,0,$where);
    return $cate[0][$filedname];
    }
    // ==============================
    // 功能:判断一个分类是否有子类
    // 参数:当前分类的pid
    // 返回:如果有子类返回子类的查询,如果没有返回假
    // ==============================
    function child_exists($pid){
    $sql = "SELECT * FROM `{$this->tabName}` WHERE `pid`='".$pid."'";
    return $this->mysqli->query($sql);
    }}
    ?>
      

  2.   

    从数据库里取出所有的id name pid 分别赋值给三个数组 $a $b $c
    然后遍历数组