其实非常的简单的加上红色部分
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');
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');
麻烦大哥添给类添加一个方法功能是返回当前位置如下
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)
{
函数可以输出:车->火车->小火车
}
大哥不好意思,感觉您的思路是错误的啊?如果这样的话$this->layer的值就会不正确,你认为呢?
麻烦您看一下,还有什么其它的办法没有,谢谢了,藏大哥
跟那个没关系
看来昨天给你解释的那么多白说了每一个大类就是一个数组,这个数组里包含了所有的子分类,而这些子分类默认是按ID的升序排序的也就是说你不加条件的情况下所有的都是按ID升序排序的
你加了一个排序条件有什么区别吗?
没区别吧
第一次测试:
$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]
按我之前说的思路
什么都不用改$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);
算了大哥,我太笨了,还是二年前搞过半年的php,现在重新拾起做个分类网站,
唉,大哥你说如果不移动分类的话,就算子分类再多按照你上面的方法做也不会出错吧?
希望藏大哥明天起来指点一下,谢谢了
如果把数组查询出来排序的话还要利用其深度判断同一级别下的数组再排序好复杂!!!!!!!!!!!!!!!!
不可能,一般的充许让用户操作的是可以删除分类,可以排序分类,可以修改分类的名字
id是不让他修改的。
//移动目录,修改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);