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 实现无限极分类详解相关推荐

  1. php实现无限极分类算法,PHP无限极分类函数的实现方法实例详解

    这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路.实现代码与相关注意事项,需要的朋友可以参考下 本文实例讲述了PHP无限极分类函数的实现方法.分享 ...

  2. 无限级分类 php_PHP无限极分类函数的实现方法详解

    这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路.实现代码与相关注意事项,需要的朋友可以参考下 本文实例讲述了PHP无限极分类函数的实现方法.分享 ...

  3. php什么是无限极分类,PHP无限极分类

    下面为大家介绍的是PHP无限极分类的代码,希望能够帮助到大家,大家一起来看一看吧function genTree5($items) { foreach ($items as $item) $items ...

  4. php无限极分类思路,php无限极分类的方法

    本篇文章主要介绍php无限极分类的方法,感兴趣的朋友参考下,希望对大家有所帮助. 代码如下:<?php $conn = mysql_connect("localhost",& ...

  5. 无限极分类原理php,浅谈PHP无限极分类原理

    1.递归:程序调用自身的编程技巧称为递归 2.案例: /** * @param 递归 $[name] */ function deeploop(&$i=1){ echo $i; $i++; i ...

  6. php实现无限分类超牛逼,PHP超牛逼无限极分类生成树方法_php技巧

    你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了. 这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. 代码如下: fun ...

  7. 无限极分类原理与实现

    前言 无限极分类是我很久前学到知识,今天在做一个项目时,发现对其概念有点模糊,所以今天就来说说无限极分类. 首先来说说什么是无限极分类.按照我的理解,就是对数据完成多次分类,如同一棵树一样,从根开始, ...

  8. php无极分类非递归_无限极分类算法,对你一定有帮助

    无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极分类算法进行总结归纳,其实大多数就是迭代与递归. 1.循环迭代实现 $arr = [1=>['id'= ...

  9. php不使用递归实现无限极分类

    无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...

最新文章

  1. tomcat参数java_opts调整
  2. 【控制】《多无人机协同控制技术》周伟老师-第4章-基于 PID 的无人机编队运动控制策略
  3. Play Framework介绍:主要概念(转)
  4. Error(6,35)java: 程序包 不存在,解决办法
  5. 番茄花园win11 32位专业版镜像系统v2021.07
  6. html5 超链接 图像映射,链接图像
  7. Intellij Idea打包jar
  8. 关于DataSet与Strongly typed DataSet几点思考(原创)
  9. poi 和jxl导出excel(2)
  10. Windows虚拟机忘记操作系统密码
  11. 【FFmpeg4.1.4】音视频分离器
  12. 单细胞转录组测序建库方法小结
  13. 苹果手机制作铃声 (简易版)
  14. Android Q暗色模式适配踩坑—状态栏
  15. 使用联通云OSS小程序直传
  16. CentOS(/dev/mapper/centos-root)进行磁盘扩容
  17. Vue+Cesium创建项目并加载地图全过程
  18. 手机端实现手机键盘搜索
  19. jmeter性能测试报告之图形化展示
  20. 服务器开关电源型号ab和sb,北京DELTA DPS-500AB-21A 500W 小1U开关电源 FLEX 80PLUS 白金价格 - 中国供应商...

热门文章

  1. 天数怎么换算成月_excel表中,怎么把日期数转换成月份数呢?
  2. Oracle学习的经验谈
  3. Java中扫雷游戏的递归算法_扫雷之递归
  4. 快速gcd vs 普通gcd
  5. C端产品和B端产品的区别
  6. coredata 详解
  7. 别人的面经(算法方向)
  8. String转int问题分析
  9. 惠普台式计算机BIOS密码设置,惠普电脑开机bios密码忘了怎么解决
  10. 基于区块链技术的性能测试