其实非常的简单的加上红色部分
function SortClass($link, $table,$order){
        $this->setNode(0, -1, '顶极节点');
        $this->link = $link;
        $this->table = $table;
        $this.order=$order
        $node = array();
        $results = mysql_query('select * from '.$this->table.' '.$this.order.'',$this->link);
        while($node = mysql_fetch_assoc($results)){
            $this->setNode($node['cid'],$node['pid'],$node['cname']);
        }
    }
即可
调用的时候你加一个条件过去即可
$tree = new SortClass($link,'`class`','order by orderId');

解决方案 »

  1.   

    上面红色的写错了应该$this->order
      

  2.   

    不好意思大哥我太笨了不要笑话,
    麻烦大哥添给类添加一个方法功能是返回当前位置如下
    cid pid cname orderId 
    1  0    人    50 
    2  0    车    20 
    3  1  男人    2 
    4  1  女人    1 
    5  2  汽车    1 
    6  2  火车    2 
    7  6  大火车  2
    8  6  小火车  2  position(8)//当前分类的id
    function position($id)
    {
     函数可以输出:车->火车->小火车
    }
      

  3.   


    大哥不好意思,感觉您的思路是错误的啊?如果这样的话$this->layer的值就会不正确,你认为呢?
    麻烦您看一下,还有什么其它的办法没有,谢谢了,藏大哥
      

  4.   


    跟那个没关系
    看来昨天给你解释的那么多白说了每一个大类就是一个数组,这个数组里包含了所有的子分类,而这些子分类默认是按ID的升序排序的也就是说你不加条件的情况下所有的都是按ID升序排序的
    你加了一个排序条件有什么区别吗?
    没区别吧
      

  5.   

    据库结构如下图:
    第一次测试:
    $result = $db->query("select * from $tableName order by orderId desc");
    $tree = new Tree($db,"test");
    print_r($tree->layer);
    输出:Array ( [-1] => -1 [0] => 0 [6] => 0 [1] => 1 [2] => 1 [3] => 2 [4] => 2 [5] => 2 ) 第二次测试:
    $result = $db->query("select * from $tableName");
    $tree = new Tree($db,"test");
    print_r($tree->layer);
    输出:Array ( [-1] => -1 [0] => 0 [1] => 1 [2] => 1 [3] => 2 [4] => 2 [5] => 2 [6] => 2 ) 藏大哥仔细看一下第一次和第二次输出 id=6的分类的深度第一次是:0 第二次是:2
    大哥怎么说没有什么影响呢?
    <?php
    /*
    Tree 无限分类
    */
    class Tree
    {
    public $name = array();//分类名字
    public $child = array(-1=>array());//子分类
    public $layer = array(-1=>-1);//分类深度
    public $parent = array();//父分类
    public $db;//数据库对像
    public $tableName;//表名字
    function __construct($db,$tableName)
    {
    $this->db = $db;
    $this->tableName = $tableName;
    $this->setNode(0,-1,"根节点");
    $result = $db->query("select * from $tableName");
    foreach($result as $v)
    {
    $this->setNode($v["id"],$v["fid"],$v["name"]);
    }
    }
    function setNode($id,$parent,$name)
    {
    $parent = $parent ? $parent : 0;
    $this->name[$id] = $name;
    $this->child[$id] = array();
    $this->child[$parent][] = $id;
    $this->parent[$id] = $parent;
        if (!isset($this->layer[$parent]))//初始化的时候layer[0] = 0
            {
    $this->layer[$id] = 0;
    }
            else
            {
    $this->layer[$id] = $this->layer[$parent] + 1;
    }
    }
    function getList(&$tree,$root=0)
    {
    foreach($this->child[$root] as $key=>$id)
    {
    $tree[] = $id;
    if($this->child[$id])
    {
    $this->getList($tree,$id);
    }
    }
    }
    function getChilds($id=0)
    {
    $child = array($id);
    $this->getList($child,$id);
    return $child;
    }
    }
    ?>
    [code=PHP]
    <?php
    include("inc/db.php");
    include("inc/function.php");
    include("inc/class.php");
    include("inc/config.php");
    $tree = new Tree($db,"test");
    print_r($tree->layer);
    ?>[/code]
      

  6.   

    不过也有解决方法
    按我之前说的思路
    什么都不用改$tree = new SortClass($link,'`class`',' order by pid,orderId desc');
    这样就可以了如果按你上面那个写的可以这样
    $result = $db->query("select * from $tableName order by pid,orderId desc"); 
    $tree = new Tree($db,"test"); 
    print_r($tree->layer); 
      

  7.   


    算了大哥,我太笨了,还是二年前搞过半年的php,现在重新拾起做个分类网站,
    唉,大哥你说如果不移动分类的话,就算子分类再多按照你上面的方法做也不会出错吧?
    希望藏大哥明天起来指点一下,谢谢了
      

  8.   

    lovewangya 美女 藏大哥说得对,
    如果把数组查询出来排序的话还要利用其深度判断同一级别下的数组再排序好复杂!!!!!!!!!!!!!!!!
      

  9.   

    藏大哥您说:“如果他在做修改时把父类修改了,还是一样有那问题存在 ”不太明白你的意思,你说的把父类也修改了是指什么,修改父亲类的id?
    不可能,一般的充许让用户操作的是可以删除分类,可以排序分类,可以修改分类的名字
    id是不让他修改的。
      

  10.   


    //移动目录,修改order都要重新生成一遍数据.
    $sql = "select * from table order by orderId asc";
    //得到
    //========================================================
    $result[0] = array('cid'=>4,'pid'=>1,'cname'=>'女人','orderId'=>1);
    $result[1] = array('cid'=>5,'pid'=>2,'cname'=>'汽车','orderId'=>1);
    $result[2] = array('cid'=>6,'pid'=>1,'cname'=>'男人','orderId'=>2);
    $result[3] = array('cid'=>3,'pid'=>2,'cname'=>'火车','orderId'=>2);
    $result[4] = array('cid'=>2,'pid'=>0,'cname'=>'车','orderId'=>20);
    $result[5] = array('cid'=>1,'pid'=>0,'cname'=>'人','orderId'=>50);
    //供参考
    class simpleTreeHandler
    {
    function simpleTreeHandler($rs,$idName,$pidName)
    {
    $this->idName = $idName;
    $tree = array();
    foreach((array)$rs as $k=>$v)
    {
    $list = @$tree[$v[$pidName]] ? $tree[$v[$pidName]] : array();
    array_push($list,$v);
    $tree[$v[$pidName]] = $list;
    }
    ksort($tree);
    $this->treeArray = $tree;
    }
    function showTree($root,$grade)
    {
    if( $this->treeArray[$root] )
    {
    foreach($this->treeArray[$root] as $k=>$v)
    {
    $t = $v[$this->idName];
    $str  = str_repeat(" - ",$grade);
    $html .="{$str}{$v['cname']} 级别:({$grade}) 排序{$v['orderId']}<br/>";
    if($this->treeArray[$t] ) 
    {
    $gx = $grade + 1;
    $html .= $this->showTree( $t,$gx );
    }
    }
    }
    return $html;
    }
    }
    $tree = new simpleTreeHandler($result,'cid','pid');
    echo $tree->showTree(0,0);