php无极分类非递归_php实现无限级分类(递归方法)
相信很多学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)分类。
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="";
foreach ($rs as $key => $val) {
$str.="{$val['name']}";
}
$str.="";
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.="{$val['name']}>";
}
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;
}
}
类中函数主要采取了递归函数的方法,如果理解深刻理解递归函数,其余的部分也就水到渠成了。我会在后面的部分详细介绍实现递归函数的三种方法。
我们再来看一个实例:
首先建立分类信息表:
CREATE TABLE IF NOT EXISTS `category` (
`categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`parentId` smallint(5) unsigned NOT NULL DEFAULT '0',
`categoryName` varchar(50) NOT NULL,
PRIMARY KEY (`categoryId`)
) ;
插入若干数据:
INSERT INTO `category` (`categoryId`, `parentId`, `categoryName`) VALUES
(1, 0, 'php'),
(2, 0, 'java'),
(3, 0, 'c/c++'),
(4, 1, 'php基础'),
(5, 1, 'php开源资料'),
(6, 1, 'php框架'),
(7, 2, 'java Se'),
(8, 2, 'java EE'),
(9, 2, 'java Me'),
(10, 3, 'c/c++基础编程'),
(11, 3, 'c/c++系统开发'),
(12, 3, 'c嵌入式编程'),
(13, 3, 'c++应用开发'),
(14, 13, 'c++桌面应用开发'),
(15, 13, 'c++游戏开发');
下面是php代码:
/*
php无限极分类
*/
//获取某分类的直接子分类
function getSons($categorys,$catId=0){
$sons=array();
foreach($categorys as $item){
if($item['parentId']==$catId)
$sons[]=$item;
}
return $sons;
}
//获取某个分类的所有子分类
function getSubs($categorys,$catId=0,$level=1){
$subs=array();
foreach($categorys as $item){
if($item['parentId']==$catId){
$item['level']=$level;
$subs[]=$item;
$subs=array_merge($subs,getSubs($categorys,$item['categoryId'],$level+1));
}
}
return $subs;
}
//获取某个分类的所有父分类
//方法一,递归
function getParents($categorys,$catId){
$tree=array();
foreach($categorys as $item){
if($item['categoryId']==$catId){
if($item['parentId']>0)
$tree=array_merge($tree,getParents($categorys,$item['parentId']));
$tree[]=$item;
break;
}
}
return $tree;
}
//方法二,迭代
function getParents2($categorys,$catId){
$tree=array();
while($catId != 0){
foreach($categorys as $item){
if($item['categoryId']==$catId){
$tree[]=$item;
$catId=$item['parentId'];
break;
}
}
}
return $tree;
}
//测试 部分
$pdo=new PDO('mysql:host=localhost;dbname=test','root','8888');
$stmt=$pdo->query("select * from category order by categoryId");
$categorys=$stmt->fetchAll(PDO::FETCH_ASSOC);
$result=getSons($categorys,1);
foreach($result as $item)
echo $item['categoryName'].'
';
echo '
';
$result=getSubs($categorys,0);
foreach($result as $item)
echo str_repeat(' ',$item['level']).$item['categoryName'].'
';
echo '
';
$result=getParents($categorys,7);
foreach($result as $item)
echo $item['categoryName'].' >> ';
echo '
';
$result=getParents2($categorys,15);
foreach($result as $item)
echo $item['categoryName'].' >> ';
?>
看下最终结果吧
虽然本文介绍的是使用递归来实现的无限级分类,但实际上,并不推荐大家这么做,大家知道分类多了,递归效率也就低了,本文这里仅仅是为了让大家更好的理解递归才这么做的。
php无极分类非递归_php实现无限级分类(递归方法)相关推荐
- php无极分类非递归_PHP中的无限级分类、无限嵌套评论
php中文网最新课程 每日17点准时技术干货分享 一般来说,递归被称为函数自身的调用. 递归在开发中的实际运用 N级分类 无限级的分类在平常的开发中是常见的需求,并且在不少面试题中都会碰到.不管你做什 ...
- php无极分类非递归_无限极分类算法,对你一定有帮助
无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极分类算法进行总结归纳,其实大多数就是迭代与递归. 1.循环迭代实现 $arr = [1=>['id'= ...
- php无限级分类是什么意思,PHP 无限级分类(递归)
网上有很多,这是我自己做测试用的 $arr = array( array('id'=>1,'name'=>'电脑','pid'=>0), array('id'=>2,'name ...
- php 非递归调用,php 无限分类(非递归)
/** * 无限分类 * 2011/8/24 * kcj * */ include "../conn/conn.php"; $flpid=$_POST['flpid']; $flt ...
- jquery实现层级显示 效果图_php运用无限级分类实现评论及回复功能
经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止; 从技术角度分析 ...
- php 递归实现无限极分类和排序_php 无限极分类以及使用递归实现的排序方法
至于添加删除之类的功能我就不多写了!仔细看看就知道这么用了. 难的是显示方面 希望高手扩展一下! 这是类 代码如下:<?php /*=============================== ...
- php修改新闻分类代码,完整的新闻无限级分类代码,可添加,删除,移动,修改
//连接数据库教程 $link = mysql教程_connect('localhost','root','密码') or die(mysql_error()); mysql_select_db('s ...
- 非递归一次性加载分类数据到TreeViw
不是经常用,发现再次用到时又要再写一遍,这次花点时间记录一下 代码: ------------------------------------- private void InitView() ...
- 【转】Treeview 无限分类非递归终极解决方案
表结构如下 表名 Test 写个存储过程 GetTreeview 这个不用我说了吧下面用到 为了速度缓存DataTable Public Function GetTreeTable() As Data ...
最新文章
- 无法量产自动驾驶汽车的企业,与谷歌公司差在哪儿
- linux命令tcpdump
- TensorFlow.NET 在工业部署中的应用
- Beta版本(有更改)
- 编码格式与Datatable数据
- leetcode探索动态规划(一)
- iif函数 vfp_vfp常用函数
- 西门子cnc sinumerik_2020邯郸cnc加工中心编程要多久就是工厂傅
- 通信LOGO隐秘史(续集:运营商篇)
- signal 11 linux,linux signal 11 是什么意思
- JVM标配、X和XX参数
- window下isa防火墙详细安装
- Excel宏被禁用解决办法
- 数据库根据身份证号码判别性别
- GPS从入门到放弃(十五)、DCB差分码偏差
- 盛大搅局手游市场:引入日系卡牌游戏_0
- Android-7.0系统安装异常之解析包错误
- COCOS2D-X 单机游戏防八门神器修改数据
- vue + 百度地图 +点位标注
- (几何学:五六边形面积)编写一个程序,提示用户输入五边形顶点到中心的距离r,然后算出五边形的面积。
热门文章
- Python 剪切板读写
- 域名申请、备案、SSL证书购买、SSL证书部署
- EXCEL实用函数组介绍
- 【Docker技术内幕】(三)docker基础架构
- 北邮和西电真的厉害,看到许多985的喊0 offer,同时也看到一大堆北邮西电的人秀出高薪offer...
- Windows完全更换ubuntu系统
- Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs
- 【BERT】Transformer理论详解(一)
- kafka-消息格式
- 首个封禁ChatGPT的国家出现,意大利出手了! OpenAI CEO:我觉得没违规