PHP实现查询多级分类的程序代码
发布:smiling 来源: PHP粉丝网 添加日期:2014-07-29 14:14:02 浏览: 评论:0
无限级分类是我们常用见的一个程序方法了,原理是得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个children子数组,记录它的子分类,这样一级一级的分级数组.
算法的数据库结构设计最为简单,category表中一个字段id,一个字段fid(父id),这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层.
我们先查出数组,代码如下:
- <?php
- $a = array(
- 'AAAAAA' => array(
- 'aaaaaa' => array(
- '111111',
- '222222',
- '333333'
- ),
- 'bbbbbb' => array(
- '111111',
- '222222',
- '333333'
- ),
- 'cccccc' => array(
- '111111',
- '222222',
- '333333'
- ),
- ),
- 'BBBBBB' => array(
- 'aaaaaa' => array(
- '111111',
- '222222',
- '333333'
- ),
- 'bbbbbb'=> array(
- '111111',
- '222222',
- '333333'
- ),
- 'cccccc'=> array(
- '111111',
- '222222',
- '333333'
- ),
- ),
- 'CCCCCC' => array(
- 'aaaaaa'=> array(
- '111111',
- '222222',
- '333333'
- ),
- 'bbbbbb'=> array(
- '111111',
- '222222',
- '333333'
- ),
- 'cccccc' => array(
- '111111',
- '222222',
- '333333'
- ),
- ),
- );
- foreach ($a as $k=>$v){
- echo $k."<br>";
- // if(is_array($v)){
- foreach($v as $key=>$val){
- echo " ".$key."<br>";
- // }
- if(is_array($val)){
- foreach($val as $kkk=>$vall){
- echo " ".$vall."<br>";
- }
- }
- }
- echo "<br>";
- }
- /*******mysql查询无限级分类的代码******/
- /***
- $sql = "SELECT a.Title AS big, b.Title AS small
- FROM largeTitle AS a LEFT JOIN smallTitle AS b ON a.ID=b.LargeID";
- $a = array();
- $r = mysql_query($sql);
- while( $arr = mysql_fetch_array($r)){
- $a[$arr['big']] = $arr['small'];
- }
- ***/
- ?>
好了下面先读取数据库然后再递归读出.
分类表,比如category,字段有 id,parentid,title,代码如下:
- //查询
- $dsql->SetQuery("SELECT * FROM category ORDER BY sortorder ASC");
- $dsql->Execute('parentlist');
- $array = array();
- $parentlist = array();
- while ($rs=$dsql->getObject('parentlist'))
- {
- if($rs->parentid == 0)
- {
- $parentlist[$rs->id] = (array)$rs;
- }
- else
- {
- $array[$rs->id] = (array)$rs;
- }
- }
- $parentlist = cat_options($parentlist, $array); //我们求的结果数组
- //$list父级分类的数组
- //$array是除父级分类外的全部分类的数组
- function cat_options(&$list,&$array)
- {
- foreach ($list as $key => $arr)
- {
- foreach ($array as $k => $value)
- {
- if($value['parentid'] == $arr['id'])
- {
- $list[$key]['children'][] = $value;
- unset($array[$k]);
- }
- }
- }
- foreach ($list as $key => $arr)
- {
- if(is_array($arr['children']) && count($arr['children']) > 0)
- {
- $list[$key]['children'] = cat_options($list[$key]['children'], $array);
- }
- }
- return $list;
- }
其它的方法,设置fid字段类型为varchar,将父类id都集中在这个字段里,用符号隔开,比如:1,3,6,这样可以比较容易得到各上级分类的ID,而且在查询分类下的信息的时候,可以使用:SELECT * FROM category WHERE pid LIKE “1,3%”,代码如下:
- --
- -- 表的结构 `category`
- --
- CREATE TABLE IF NOT EXISTS `category` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `type` int(11) NOT NULL COMMENT '1为文章类型2为产品类型3为下载类型',
- `title` varchar(50) NOT NULL,
- `lft` int(11) NOT NULL,
- `rgt` int(11) NOT NULL,
- `lorder` int(11) NOT NULL COMMENT '排序',
- `create_time` int(11) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
- --
- -- 导出表中的数据 `category`
- --
- INSERT INTO `category` (`id`, `type`, `title`, `lft`, `rgt`, `lorder`, `create_time`) VALUES
- (1, 1, '顶级栏目', 1, 18, 1, 1261964806),
- (2, 1, '公司简介', 14, 17, 50, 1264586212),
- (3, 1, '新闻', 12, 13, 50, 1264586226),
- (4, 2, '公司产品', 10, 11, 50, 1264586249),
- (5, 1, '荣誉资质', 8, 9, 50, 1264586270),
- (6, 3, '资料下载', 6, 7, 50, 1264586295),
- (7, 1, '人才招聘', 4, 5, 50, 1264586314),
- (8, 1, '留言板', 2, 3, 50, 1264586884),
- (9, 1, '总裁', 15, 16, 50, 1267771951);
- /**
- * 显示树,把所有的节点都显示出来。
- * 1、先得到根结点的左右值(默认根节点的title为“顶级目录”)。
- * 2、查询左右值在根节点的左右值范围内的记录,并且根据左值排序。
- * 3、如果本次记录右值大于前次记录的右值则为子分类,输出时候加空格。
- * @return array
- **/
- function display_tree(){
- //获得root左边和右边的值
- $arr_lr = $this->category->where("title = '顶级栏目'")->find();
- //print_r($arr_lr);
- if($arr_lr){
- $right = array();
- $arr_tree = $this->category->query("SELECT id, type, title, rgt FROM category WHERE lft >= ". $arr_lr['lft'] ." AND lft <=".$arr_lr['rgt']." ORDER BY lft");
- foreach($arr_tree as $v){
- if(count($right)){
- while ($right[count($right) -1] < $v['rgt']){
- array_pop($right);
- }
- }
- $title = $v['title'];
- if(count($right)){
- $title = '|-'.$title;
- }
- $arr_list[] = array('id' => $v['id'], 'type' => $type, 'title' => str_repeat(' ', count($right)).$title, 'name' =>$v['title']);
- $right[] = $v['rgt'];
- }
- return $arr_list;
- }
- }
好了 只要这样所有的分类都可以一次性查询出来了,而不用通过递归了.
Tags: PHP多级分类 程序代码
相关文章
- ·php实现多级分类筛选程序代码(2015-04-04)
- ·php中生成短网址实现程序代码(2014-01-06)
- ·php 获取checkbox表单取值程序代码(2014-03-05)
- ·php 页面跳转实现程序代码(2014-03-18)
- ·PHP中获取URL完整路径程序代码(2014-07-28)
- ·php提取字符串中网站url地址程序代码(2014-09-22)
- ·PHP常用的小程序代码段(2021-06-26)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)