php 实现无限极分类详解
php 实现无限极分类
原始数据复制代码
$array = array(array('id' => 1, 'pid' => 0, 'n' => '河北省'),array('id' => 2, 'pid' => 0, 'n' => '北京市'),array('id' => 3, 'pid' => 1, 'n' => '邯郸市'),array('id' => 4, 'pid' => 2, 'n' => '朝阳区'),array('id' => 5, 'pid' => 2, 'n' => '通州区'),array('id' => 6, 'pid' => 4, 'n' => '望京'),array('id' => 7, 'pid' => 4, 'n' => '酒仙桥'),array('id' => 8, 'pid' => 3, 'n' => '永年区'),array('id' => 9, 'pid' => 1, 'n' => '武安市'),array('id' => 10, 'pid' => 8, 'n' => '永年区镇'),array('id' => 11, 'pid' => 0, 'n' => '上海市')
);
复制代码生成无限极分类按 Ctrl+C 复制代码/** 所有的分类* @parem $array 数组* @parem $pid ,最高级别,默认为0,输出从pid 级别的数据* @parem $level 层级,默认0* */
function getTree($array, $pid =0, $level = 0){$f_name=__FUNCTION__; // 定义当前函数名//声明静态数组,避免递归调用时,多次声明导致数组覆盖static $list = [];foreach ($array as $key => $value){//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点if ($value['pid'] == $pid){//父节点为根节点的节点,级别为0,也就是第一级$flg = str_repeat('|--',$level);// 更新 名称值$value['n'] = $flg.$value['n'];// 输出 名称echo $value['n']."<br/>";//把数组放到list中$list[] = $value;//把这个节点从数组中移除,减少后续递归消耗unset($array[$key]);//开始递归,查找父ID为该节点ID的节点,级别则为原级别+1$f_name($array, $value['id'], $level+1);}}return $list;
}
// 调用
$list=getTree($array);
按 Ctrl+C 复制代码
调用结果:复制代码
河北省
|--邯郸市
|--|--永年区
|--|--|--永年区镇
|--武安市
北京市
|--朝阳区
|--|--望京
|--|--酒仙桥
|--通州区
复制代码嵌套标签,前端可以(通过选取子节点)全选、取消全选复制代码
function getTree($array, $pid =0, $level = 0){$f_name=__FUNCTION__; // 定义当前函数名// 空数组 不在执行if(empty($array))return;//声明静态数组,避免递归调用时,多次声明导致数组覆盖static $html;$html.="<ul>";foreach ($array as $key => $value){//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点if ($value['pid'] == $pid){//父节点为根节点的节点,级别为0,也就是第一级$flg = str_repeat('|--',$level);// 更新 名称值$value['n'] = $flg.$value['n'];$html.=$temp="<li><input type=\"checkbox\" name=\"limit_id[]\" value='".$value['id']."' >".$value['n'];//把这个节点从数组中移除,减少后续递归消耗unset($array[$key]);//开始递归,查找父ID为该节点ID的节点,级别则为原级别+1$vv=$f_name($array, $value['id'], $level+1);// 如果顶级分类下没有一个下级,删除此分类,此步骤可以省略if(empty($vv) && ($pid<1)){$html=str_replace($temp,'',$html);}$html.="</li>\r\n";}}$html.="</ul>\r\n";// 删除多余的 ul 标签$html=str_replace("<ul></ul>",'',$html);return $html;
}
复制代码
html 输出结果复制代码
<ul><li><input type="checkbox" name="limit_id[]" value='1'>河北省<ul><li><input type="checkbox" name="limit_id[]" value='3'>|--邯郸市<ul><li><input type="checkbox" name="limit_id[]" value='8'>|--|--永年区<ul><li><input type="checkbox" name="limit_id[]" value='10'>|--|--|--永年区镇</li></ul></li></ul></li><li><input type="checkbox" name="limit_id[]" value='9'>|--武安市</li></ul></li><li><input type="checkbox" name="limit_id[]" value='2'>北京市<ul><li><input type="checkbox" name="limit_id[]" value='4'>|--朝阳区<ul><li><input type="checkbox" name="limit_id[]" value='6'>|--|--望京</li><li><input type="checkbox" name="limit_id[]" value='7'>|--|--酒仙桥</li></ul></li><li><input type="checkbox" name="limit_id[]" value='5'>|--通州区</li></ul></li></li>
</ul>
复制代码jquery 操作全选复制代码
//父级选中 自动选中子级,同时选中自己的父级$('input[type="checkbox"]').change(function(e) {var checked = $(this).prop("checked"),container = $(this).parent(),siblings = container.siblings();container.find('input[type="checkbox"]').prop({indeterminate: false,checked: checked});function checkSiblings(el) {var parent = el.parent().parent(),all = true;el.siblings().each(function() {return all = ($(this).children('input[type="checkbox"]').prop("checked") === checked);});if (all && checked) {parent.children('input[type="checkbox"]').prop({indeterminate: false,checked: checked});checkSiblings(parent);} else if (all && !checked) {parent.children('input[type="checkbox"]').prop("checked", checked);parent.children('input[type="checkbox"]').prop("indeterminate", (parent.find('input[type="checkbox"]:checked').length > 0));checkSiblings(parent);} else {el.parents("li").children('input[type="checkbox"]').prop({indeterminate: true,checked: false});}}checkSiblings(container);});// 父级选中 自动选中子级/*$("input[type=checkbox]").each(function (i,ele){let _this=$(this);_this.click(function(){if(_this.prop('checked')==true){_this.parent().find('ul input').prop('checked',true);}else{_this.parent().find('ul input').prop('checked',false);}});});*/
复制代码数组嵌套引用嵌套,php变量默认的传值方式是按指传递,也就是说 假如说 遍历顺序是 河北省 邯郸市 当遍历到河北省时需要把河北省放到tree中,遍历到邯郸市时,需要把邯郸市放到河北省的子节点数组中,所以这里用到了引用传递,当你对河北省做更改时,tree数组中的河北省也一并做了更改复制代码
function getTree($list, $pid = 0)
{$tree = [];if (!empty($list)) {$newList = [];foreach ($list as $k => $v) {$newList[$v['id']] = $v;}foreach ($newList as $value ) {if ($pid == $value['pid']) {$tree[] = &$newList[$value['id']];} elseif (isset($newList[$value['pid']])){$newList[$value['pid']]['items'][] = &$newList[$value['id']];}}// 如果顶级分类下没有一个下级,删除此分类,此步骤可以省略foreach ($tree as $k=>$v){if(!isset($v['items']) && ($pid<1))unset($tree[$k]);}}return $tree;
}
// 调用
$list=getTree($array);
var_dump($list);
复制代码
显示结果复制代码
array(2) {[0]=>array(4) {["id"]=>int(1)["pid"]=>int(0)["n"]=>string(9) "河北省"["items"]=>array(2) {[0]=>array(4) {["id"]=>int(3)["pid"]=>int(1)["n"]=>string(9) "邯郸市"["items"]=>array(1) {[0]=>array(4) {["id"]=>int(8)["pid"]=>int(3)["n"]=>string(9) "永年区"["items"]=>array(1) {[0]=>array(3) {["id"]=>int(10)["pid"]=>int(8)["n"]=>string(12) "永年区镇"}}}}}[1]=>array(3) {["id"]=>int(9)["pid"]=>int(1)["n"]=>string(9) "武安市"}}}[1]=>array(4) {["id"]=>int(2)["pid"]=>int(0)["n"]=>string(9) "北京市"["items"]=>array(2) {[0]=>array(4) {["id"]=>int(4)["pid"]=>int(2)["n"]=>string(9) "朝阳区"["items"]=>array(2) {[0]=>array(3) {["id"]=>int(6)["pid"]=>int(4)["n"]=>string(6) "望京"}[1]=>array(3) {["id"]=>int(7)["pid"]=>int(4)["n"]=>string(9) "酒仙桥"}}}[1]=>array(3) {["id"]=>int(5)["pid"]=>int(2)["n"]=>string(9) "通州区"}}}
}
复制代码根据子类id查找出所有父级分类信息复制代码
/**根据指定id 的查询,所有的父节点* @parem $id_pid 要查询的id 或者 要查询id的pid;如果传入的是id 包括当前id 值,如果传入id_pid不包括当前id的值* @parem $array 查分类的数据,在项目使用中此参数可以不传,直接使用sql 查询* @parem $level 当前id所在层级,默认2* */
function getParent($id_pid,$array=array(), $level = 2)
{$f_name=__FUNCTION__; // 定义当前函数名static $list=array();//$array=Db::table('table_name')->where('id',$id_pid)->select(); TP5foreach($array as $k=>$v){if($v['id']== $id_pid){ //父级分类id等于所查找的id$flg = str_repeat('|--',$level);// 更新 名称值$v['n'] = $flg.$v['n'];// 输出 名称echo $v['n']."<br/>";$list[]=$v;// 删除数组unset($array[$k]);if($v['pid']>=0){$f_name($v['pid'],$array,$level-1);}}}return $list;
}
// 调用
getParent(10,$array, $level = 3);
echo "<hr/>";
getParent(8,$array, $level = 3);
复制代码
调用结果显示复制代码
getParent(10,$array, $level = 3);
|--|--|--永年区镇
|--|--永年区
|--邯郸市
-----------------------------------------
getParent(8,$array, $level = 3);
河北省
|--|--|--永年区
|--|--邯郸市
|--河北省
复制代码根据父id获得所有下级子类数复制代码
/**根据指定id 查询,所有的子节 * @parem $id 要查询的id * @parem $array 查分类的数据,在项目使用中此参数可以不传,直接使用sql 查询* @parem $level 层级,默认1* */
function getSon($id,$array=array(),$level=1)
{$f_name=__FUNCTION__; // 定义当前函数名static $list;//$array=Db::table('table_name')->where('pid',$id)->select(); TP5foreach ($array as $k => $v){if($v['pid'] == $id){$flg = str_repeat('|--',$level);// 更新 名称值$v['n'] = $flg.$v['n'];// 输出 名称echo $v['n']."<br/>";//存放数组中$list[] = $v;// 删除查询过的数组unset($array[$k]);$f_name($v['id'],$array,$level+1);}}return $list;
}
// 调用
$list=$f_name(1,$array);
复制代码调用结果:|--邯郸市
|--|--永年区
|--|--|--永年区镇
|--武安市
php 实现无限极分类详解相关推荐
- php实现无限极分类算法,PHP无限极分类函数的实现方法实例详解
这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路.实现代码与相关注意事项,需要的朋友可以参考下 本文实例讲述了PHP无限极分类函数的实现方法.分享 ...
- 无限级分类 php_PHP无限极分类函数的实现方法详解
这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路.实现代码与相关注意事项,需要的朋友可以参考下 本文实例讲述了PHP无限极分类函数的实现方法.分享 ...
- php什么是无限极分类,PHP无限极分类
下面为大家介绍的是PHP无限极分类的代码,希望能够帮助到大家,大家一起来看一看吧function genTree5($items) { foreach ($items as $item) $items ...
- php无限极分类思路,php无限极分类的方法
本篇文章主要介绍php无限极分类的方法,感兴趣的朋友参考下,希望对大家有所帮助. 代码如下:<?php $conn = mysql_connect("localhost",& ...
- 无限极分类原理php,浅谈PHP无限极分类原理
1.递归:程序调用自身的编程技巧称为递归 2.案例: /** * @param 递归 $[name] */ function deeploop(&$i=1){ echo $i; $i++; i ...
- php实现无限分类超牛逼,PHP超牛逼无限极分类生成树方法_php技巧
你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了. 这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. 代码如下: fun ...
- 无限极分类原理与实现
前言 无限极分类是我很久前学到知识,今天在做一个项目时,发现对其概念有点模糊,所以今天就来说说无限极分类. 首先来说说什么是无限极分类.按照我的理解,就是对数据完成多次分类,如同一棵树一样,从根开始, ...
- php无极分类非递归_无限极分类算法,对你一定有帮助
无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极分类算法进行总结归纳,其实大多数就是迭代与递归. 1.循环迭代实现 $arr = [1=>['id'= ...
- php不使用递归实现无限极分类
无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...
最新文章
- tomcat参数java_opts调整
- 【控制】《多无人机协同控制技术》周伟老师-第4章-基于 PID 的无人机编队运动控制策略
- Play Framework介绍:主要概念(转)
- Error(6,35)java: 程序包 不存在,解决办法
- 番茄花园win11 32位专业版镜像系统v2021.07
- html5 超链接 图像映射,链接图像
- Intellij Idea打包jar
- 关于DataSet与Strongly typed DataSet几点思考(原创)
- poi 和jxl导出excel(2)
- Windows虚拟机忘记操作系统密码
- 【FFmpeg4.1.4】音视频分离器
- 单细胞转录组测序建库方法小结
- 苹果手机制作铃声 (简易版)
- Android Q暗色模式适配踩坑—状态栏
- 使用联通云OSS小程序直传
- CentOS(/dev/mapper/centos-root)进行磁盘扩容
- Vue+Cesium创建项目并加载地图全过程
- 手机端实现手机键盘搜索
- jmeter性能测试报告之图形化展示
- 服务器开关电源型号ab和sb,北京DELTA DPS-500AB-21A 500W 小1U开关电源 FLEX 80PLUS 白金价格 - 中国供应商...