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 需要按如下的树型排列,请高手指导,谢谢!
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 需要按如下的树型排列,请高手指导,谢谢!
解决方案 »
- 求救:Aix5.3上安装php+mysql,无法连接数据库的问题
- 结账太早了,出现的问题……
- 求助-请问谁有全球的省市数据库
- php调用mysql,分列显示如何实现
- 关于 oracle 数据库在 PHP 列表/菜单 中的应用问题
- 询问一个DZ验证的问题,有什么最简单的方法吗?
- ImageTTFText 在FreeBSD系统下的问题
- 如何通过SMARTy模板引擎的页面,查看和修改WEB页面呀?
- 在php中可以实现以下问题:得到客户端与服务器端的连接速度,如何知道客户端是拨号上网还是通过双绞线上网?
- fastboard.org没了!
- php有没有在任何用户的浏览器都能访问的变量?
- $userName =$userName可以直接获取URL参数?
<?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);
}}
?>
然后遍历数组