一个好用的php 实现无限分类的方法

billhu001 2011-01-27 05:21:43


数据的存储结构是这样的:

id,pid,name

解释:

id为自身编号,pid为父分类的编号(如果根则为0),name 为分类名称



无限分类的思想:

也就是用一个数组来表示一个树形的结构的方法,基本思路是结果数组 tree 中,所有根元素放到 tree[0] 中。二级栏目(根元素的子)放到 tree[1] 中,第n层次的元素的子元素放到 tree[n] 当中。



具体实现:

<?php
/**
* @author: huliang
* @description: 无限分类示例
**/
header('Content-type: text/html; charset=gb2312');

//模拟数据格式,实际应用中可能数据来自于数据库
$array[] = array("id"=>1,"pid"=>0,"name"=>"计算机操作系统");
$array[] = array("id"=>2,"pid"=>0,"name"=>"探险");
$array[] = array("id"=>3,"pid"=>1,"name"=>"Linux 系统");
$array[] = array("id"=>4,"pid"=>1,"name"=>"Windows 系统");
$array[] = array("id"=>5,"pid"=>3,"name"=>"Linux相关网站");
$array[] = array("id"=>6,"pid"=>5,"name"=>"<a href='http://linuxpig.com' target='_blank'>Linuxpig.com</a>");
$array[] = array("id"=>7,"pid"=>5,"name"=>"<a href='http://linux.org' target='_blank'>Linux.org</a>");
$array[] = array("id"=>8,"pid"=>2,"name"=>"<a href='http://52risk.com' target='_blank'>52risk.com</a>");

showCategory($array);

function showCategory($array){
$tree = array();
if( $array ){
foreach ( $array as $v ){
$pid = $v['pid'];
$list = @$tree[$pid] ?$tree[$pid] : array();
array_push( $list, $v );
$tree[$pid] = $list;
}
}

//遍历输出根分类
foreach($tree[0] as $k=>$v)
{
echo "$v[name]<br />";
//遍历输出根分类相应的子分类
if($tree[$v['id']]) drawTree($tree[$v['id']],$tree,0);
echo "<div style='height:10px;'></div>";
}
}

function drawTree($arr,$tree,$level)
{
$level++;
$prefix = str_pad("|",$level+1,'-',STR_PAD_RIGHT);
foreach($arr as $k2=>$v2)
{
echo "$prefix$v2[name]<br />";
if(isset($tree[$v2['id']])) drawTree($tree[$v2['id']],$tree,$level);

}
}
?>



具体项目中可能样式和数据来源需要调整。。


原文地址:
http://www.linuxpig.com/2011/01/php-endless-category/






...全文
714 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiveAsaMonster 2011-01-28
  • 打赏
  • 举报
回复
+1[Quote=引用 3 楼 skyaspnet 的回复:]
引用楼主 huliang82 的回复:
数据的存储结构是这样的:

id,pid,name

解释:

id为自身编号,pid为父分类的编号(如果根则为0),name 为分类名称



无限分类的思想:

也就是用一个数组来表示一个树形的结构的方法,基本思路是结果数组 tree 中,所有根元素放到 tree[0] 中。二级栏目(根元素的子)放到 tree[1] 中,第n层……
[/Quote]
skyaspnet 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 huliang82 的回复:]
数据的存储结构是这样的:

id,pid,name

解释:

id为自身编号,pid为父分类的编号(如果根则为0),name 为分类名称



无限分类的思想:

也就是用一个数组来表示一个树形的结构的方法,基本思路是结果数组 tree 中,所有根元素放到 tree[0] 中。二级栏目(根元素的子)放到 tree[1] 中,第n层次的元素的子元素放到 tree[n] 当……
[/Quote]

不错,不过现实中很少用到无限分类,一般来说二级最多三级分类已经够用了,文章不错
uuq 2011-01-27
  • 打赏
  • 举报
回复
感觉在工作中很少用到这种无限分类

21,886

社区成员

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

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