php利用递归函数实现无限级分类
相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径。各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了。
什么是无限级分类?
无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类。分类无处不在,分类显得“无限”。我这里就不说无限分类的必要性了。
无限级分类原理简介
无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。
闲话不多说,该展现本文的实例了。
作为一个狂热海贼迷,这篇的实例我就以《海贼王》人物组织做案例。
数据库准备:
建表onepiece:
- create table onepiece(
- id int auto_increment,
- pid int not null,
- name varchar(225) not null,
- primary key(id)
- );
插入测试数据:
- insert onepiece values
- (1,0,'海军'),
- (2,0,'海贼'),
- (3,0,'革命军'),
- (4,1,'青雉'),
- (5,1,'赤犬'),
- (6,1,'黄猿'),
- (7,2,'四皇'),
- (8,2,'七武海'),
- (9,2,'草帽海贼团'),
- (10,9,'索隆'),
- (11,7,'香克斯'),
- (12,8,'多弗朗明哥'),
- (13,8,'克洛克达尔');
这里还是科普下海贼王里面的设定:世界分为三大阵营:海军,海贼,革命军。海军有大将:青雉,赤犬,黄猿。海贼有:四皇,七武海,草帽海贼团。四皇有香克斯,七武海有多弗朗明哥,克洛克达尔,草帽海贼团有索隆。(打个广告:海贼王真的很好看)。
最终目的:
我们今天制作的是两种形式的无限级分类形式,一种是下拉列表式,一种则是导航Link式的。直接上效果图了:
下拉列表式
导航Link式
实例代码:
我封装了一个Unlimited类,用来调用diaplayList()展现下拉列表形式,调用diaplayLink展现导航Link分类。也可以增加(addNodes())和删除(deleteNodes)分类。
- <?php
- class Unlimited{
- protected $mysqli;
- public function __construct($config){
- $this->mysqli=new mysqli($config['host'],$config['user'],$config['pwd']);
- $this->mysqli->select_db($config['db']);
- $this->mysqli->set_charset('utf8');
- if ($this->mysqli->connect_errno) {
- echo $this->mysqli->connect_error;
- }
- }
- private function getList($pid=0,&$result=array(),$spac=0){
- $spac=$spac+2;
- $sql="select * from onepiece where pid={$pid}";
- $rs=$this->mysqli->query($sql);
- while($row=$rs->fetch_assoc()) {
- $row['name']=str_repeat('  ',$spac).$row['name'];
- $result[]=$row;
- $this->getList($row['id'],$result,$spac);
- }
- return $result;
- }
- /**
- * 展现下拉列表式分类
- * @return [type]
- */
- public function displayList(){
- $rs=$this->getList();
- $str="<select name='cate'>";
- foreach ($rs as $key => $val) {
- $str.="<option >{$val['name']}</option>";
- }
- $str.="</select>";
- return $str;
- }
- private function getLink($cid,&$result=array()){
- $sql="select * from onepiece where id={$cid}";
- $rs=$this->mysqli->query($sql);
- if($row=$rs->fetch_assoc()){
- $result[]=$row;
- $this->getLink($row['pid'],$result);
- }
- return array_reverse($result);
- }
- /**
- * 展现导航Link
- * @param [type] $cid [description]
- * @return [type] [description]
- */
- public function displayLink($cid){
- $rs=$this->getLink($cid);
- $str='';
- foreach ($rs as $val) {
- $str.="<a href=''>{$val['name']}</a>>";
- }
- return $str;
- }
- /**
- * 增加分类
- * @param [type] $pid 父类id
- * @param [type] $name 本类名
- */
- public function addNodes($pid,$name){
- $sql="insert into onepiece values('',{$pid},'".$name."')";
- if($this->mysqli->query($sql)){
- return true;
- }
- }
- /**
- * 删除分类
- * @param [type] $id 本类id
- * @return [type]
- */
- public function deleteNodes($id){
- $sql="select * from onepiece where pid ={$id}";
- $rs=$this->mysqli->query($sql);
- if($row=$rs->fetch_assoc()){
- $mes="还有子元素,请勿删除";
- }else{
- $sql="delete from onepiece where id={$id}";
- if($this->mysqli->query($sql)){
- $mes="删除成功";
- }
- }
- return $mes;
- }
- }
类中函数主要采取了递归函数的方法,如果理解深刻理解递归函数,其余的部分也就水到渠成了。后面的php递归函数的三种方法详细介绍了php递归函数的原理。
php利用递归函数实现无限级分类的更多相关文章
- thinkphp实现无限级分类
普通的方法(采用for和foreach) //显示 foreach($data as $k=>$v){ //str_repeat()函数用于把字符串重复指定的次数 $data[$k]['titl ...
- PHP迭代与递归实现无限级分类
无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳. 1.循环迭代实现 $arr = [ 1=>['id'=>1,'name'=>'父1','father'=& ...
- php——两种无限级分类
/** * 无级递归分类 TP框架 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return strin ...
- 042-PHP使用闭包函数递归无限级分类
<?php //使用闭包函数递归无限级分类 function demo($array){ # 用于存储递归后的队列 $data = []; # 递归函数 $func = function (&a ...
- PHP无限级分类的实现(不使用递归)
无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...
- 一道无限级分类题的 PHP 实现
今天有网友出了道题: 给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构. origin = [('A112', 'A1122'), ( ...
- (实用篇)PHP递归实现无限级分类
在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...
- PHP+MySQL无限级分类(非递归)
要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...
- PHP无限级分类-递归(不推荐)
[http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...
随机推荐
- OS X下安装Redis及配置开机启动
1.下载redis源码包redis-3.0.5.tar(此步骤可在图形界面下操作) 2.解压源码包 tar zxvf redis-3.0.5.tar 3.编译源码并安装 #进入源码目录 cd redi ...
- .NET 分页
.net分页 1.存储过程create procedure 存储过程名( @pageIndex int, //第几页 @pageSize int ...
- 设计模式C#实现(七)——生成器模式
生成器模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. UML类图: 构成: 1.Builder(接口/抽象类)定义了创建一个产品Product的各个部件的方法,返回创 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- 详解apache的allow和deny
今天看了一篇关于apache allow,deny的文章收获匪浅,防止被删,我直接摘过来了,原文地址!!! !http://www.cnblogs.com/top5/archive/2009/09/2 ...
- Android之TelephonyManager类的方法详解
TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...
- 22 扩展Python - 《Python 核心编程》
- Linux 系统常用命令汇总(四) 程序和资源管理
程序和资源管理 分类 命令 选项 注解 背景管理 & command+& 将任务放到后台进行 ctrl+z 暂停任务 fg [%number] 讲后台程序推到前台来,number表示进 ...
- 二分法 codevs 1432 总数统计
codevs 1432 总数统计 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出n个数,统计两两之和小于k的方 ...
- 二叉树结构 codevs 1029 遍历问题
codevs 1029 遍历问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 我们都很熟悉二叉树的前序.中序.后序遍 ...