php+mysql树型目录,高手指教,谢谢!

efanlx 2011-02-17 10:09:18
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

需要按如下的树型排列,请高手指导,谢谢!
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
efanlx 2011-02-18
  • 打赏
  • 举报
回复
没人懂吗?谁帮我弄好,奖200元拿去喝茶。
efanlx 2011-02-18
  • 打赏
  • 举报
回复
要看pid这
kaifadi 2011-02-18
  • 打赏
  • 举报
回复
那样的排列看不出有什么规律啊!
efanlx 2011-02-18
  • 打赏
  • 举报
回复
还没有解决,再顶上去在线等。
efanlx 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 life169 的回复:]
从数据库里取出所有的id name pid 分别赋值给三个数组 $a $b $c
然后遍历数组
[/Quote]

可以给点代码吗?谢谢
life169 2011-02-17
  • 打赏
  • 举报
回复
从数据库里取出所有的id name pid 分别赋值给三个数组 $a $b $c
然后遍历数组
lxafl 2011-02-17
  • 打赏
  • 举报
回复
我刚写了一个,是用面向对象做的,给你参考下:
<?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);
}

}
?>

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧