视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
示例php+mysql查询实现无限下级分类树输出
2020-11-02 18:28:06 责编:小采
文档


本文实例讲述了php+mysql查询实现无限下级分类树输出。分享给大家供大家参考,具体如下:

这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类。给各位整理了几个php无限分类的例子.

【相关学习推荐:php编程(视频),mysql视频教程】

树输出:

function get_array($user_id,$top=0){
global $mysql,$_G;
 $sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id}'";
$rows= $mysql->db_fetch_arrays($sql);
 if($top==1){
 $arr[0]['name']=$user_id;
 $arr[0]['children']=array();
 }
 $top=$top+1;
foreach ($rows as $key=>$value)
 {
 $r = get_array($value['name']); //调用函数,传入参数,继续查询下级
 $arr[0]['children'][$key]['name']= $value['username']; //组合数组
 if(is_array($r)){
 $arr[0]['children'][$key]['children']= $r[0]['children'];
 }
 $i++;
 }
 return $arr;
 }
$list = get_array("1000",1); //调用函数1000是顶级ID
echo 'var data='.json_encode($list);

这个是输出 Array 然后转让为 json

例子:

表结构:id字段为分类标识,name字段为分类名,father_id字段为所属父分类的id,path字段为分类路径,储存该分类祖先的集合,isdir判断是否是目录,1为是,0为否.

显示函数:

//$count为分类等级
sort_list($str,$fatherid,$count)
{
$rs = $this->sql->re_datas("select * from sort where father_id = fatherid");
$num = $this->sql->sql_numrows();
$i=0;
$n = 1;
while(isset($rs[$i]))
{
$name = "";
for($n = 1 ; $n < $count ; $n )
{
$name.="│ ";
}
if($i 1==$num)
{
$name.="└─".$rs[$i][name];
}
else
{
$name.="├─".$rs[$i][name];
}
if($rs[$i][isdir])
{
$str.="<span style='color:#CCCCCC'>".$name."</span>";
}
else
{
$str.=$name";
}
$temp = $count 1;
$str = $this->sort_list($str,$rs[$i][id],$temp);
$i ;
}
return $str;
}

其中$this->sql对象为sql操作类对象,re_datas()函数返回查到的数组,sql_numrows()函数返回查询到的数目.

调用方法:

$sort_list = sort_list($sort_list,0,1);

例子:

表:category

id int 主键,自增
name varchar 分类名称
pid int 父类id,默认0

顶级分类的 pid 默认就是0了,当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先讲所有分类取出来,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率.
先来构建一个原始数组,这个直接从数据库中拉出来就行:

$categories = array(
 array('id'=>1,'name'=>'电脑','pid'=>0),
 array('id'=>2,'name'=>'手机','pid'=>0),
 array('id'=>3,'name'=>'笔记本','pid'=>1),
 array('id'=>4,'name'=>'台式机','pid'=>1),
 array('id'=>5,'name'=>'智能机','pid'=>2),
 array('id'=>6,'name'=>'功能机','pid'=>2),
 array('id'=>7,'name'=>'超级本','pid'=>3),
 array('id'=>8,'name'=>'游戏本','pid'=>3),
);

目标是将它转化为下面这种结构:

电脑
—笔记本
——-超级本
——-游戏本
—台式机
手机
—智能机
—功能机

用数组来表示的话,可以增加一个 children 键来存储它的子分类:

array(
 //1对应id,方便直接读取
 1 => array(
 'id'=>1,
 'name'=>'电脑',
 'pid'=>0,
 children=>array(
 &array(
 'id'=>3,
 'name'=>'笔记本',
 'pid'=>1,
 'children'=>array(
 //此处省略
 )
 ),
 &array(
 'id'=>4,
 'name'=>'台式机',
 'pid'=>1,
 'children'=>array(
 //此处省略
 )
 ),
 )
 ),
 //其他分类省略
)

处理过程:

$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
 $tree[$category['id']] = $category;
 $tree[$category['id']]['children'] = array();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $k=>$item) {
 if ($item['pid'] != 0) {
 $tree[$item['pid']]['children'][] = &$tree[$k];
 }
}

print_r($tree);打印结果如下:

Array
(
 [1] => Array
 (
 [id] => 1
 [name] => 电脑
 [pid] => 0
 [children] => Array
 (
 [0] => Array
 (
 [id] => 3
 [name] => 笔记本
 [pid] => 1
 [children] => Array
 (
 [0] => Array
 (
 [id] => 7
 [name] => 超级本
 [pid] => 3
 [children] => Array
 (
 )
 )
 [1] => Array
 (
 [id] => 8
 [name] => 游戏本
 [pid] => 3
 [children] => Array
 (
 )
 )
 )
 )
 [1] => Array
 (
 [id] => 4
 [name] => 台式机
 [pid] => 1
 [children] => Array
 (
 )
 )
 )
 )
 [2] => Array
 (
 [id] => 2
 [name] => 手机
 [pid] => 0
 [children] => Array
 (
 [0] => Array
 (
 [id] => 5
 [name] => 智能机
 [pid] => 2
 [children] => Array
 (
 )
 )
 [1] => Array
 (
 [id] => 6
 [name] => 功能机
 [pid] => 2
 [children] => Array
 (
 )
 )
 )
 )
 [3] => Array
 (
 [id] => 3
 [name] => 笔记本
 [pid] => 1
 [children] => Array
 (
 [0] => Array
 (
 [id] => 7
 [name] => 超级本
 [pid] => 3
 [children] => Array
 (
 )
 )
 [1] => Array
 (
 [id] => 8
 [name] => 游戏本
 [pid] => 3
 [children] => Array
 (
 )
 )
 )
 )
 [4] => Array
 (
 [id] => 4
 [name] => 台式机
 [pid] => 1
 [children] => Array
 (
 )
 )
 [5] => Array
 (
 [id] => 5
 [name] => 智能机
 [pid] => 2
 [children] => Array
 (
 )
 )
 [6] => Array
 (
 [id] => 6
 [name] => 功能机
 [pid] => 2
 [children] => Array
 (
 )
 )
 [7] => Array
 (
 [id] => 7
 [name] => 超级本
 [pid] => 3
 [children] => Array
 (
 )
 )
 [8] => Array
 (
 [id] => 8
 [name] => 游戏本
 [pid] => 3
 [children] => Array
 (
 )
 )
)

优点:关系清楚,修改上下级关系简单.

缺点:使用PHP处理,如果分类数量庞大,效率也会降低.

下载本文
显示全文
专题