PHP实现查询多级分类的程序代码
无限级分类是我们常用见的一个程序方法了,原理是得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个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,代码如下:
<?php //查询 $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);
로그인 후 복사
<?php /** * 显示树,把所有的节点都显示出来。 * 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; } } ?>
로그인 후 복사
好了 只要这样所有的分类都可以一次性查询出来了,而不用通过递归了.
永久链接:
转载随意!带上文章地址吧。
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사
어 ass 신 크리드 그림자 : 조개 수수께끼 솔루션
4 몇 주 전
By DDD
Windows 11 KB5054979의 새로운 기능 및 업데이트 문제를 해결하는 방법
3 몇 주 전
By DDD
Atomfall에서 크레인 제어 키 카드를 찾을 수 있습니다
4 몇 주 전
By DDD
<s> : 데드 레일 - 모든 도전을 완료하는 방법
1 몇 달 전
By DDD
Atomfall Guide : 항목 위치, 퀘스트 가이드 및 팁
1 몇 달 전
By DDD

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?
7700
15


자바 튜토리얼
1640
14


Cakephp 튜토리얼
1393
52


라라벨 튜토리얼
1287
25


PHP 튜토리얼
1230
29

