问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级。

解决:递归实现无限分类思想,每一个员工存入其所属的上级的id作为自己的pid,另外存入path,path包含自身id,方便显示路径。

递归的注意点:

1.一定有一个判断条件,否则递归就死循环了

2.每次的递归结果要保存起来,变量自增的实现三种方式:

function(&$bar):通过引用地址

global :通过设置为全局变量

static :设置为静态变量

header( "Content-type: text/html; charset=utf-8" );$arr = array( array( 'uid'=>'1', 'name'=>'总监张', 'pid'=>'0', 'path'=>'0,' ), array( 'uid'=>'2', 'name'=>'副总王', 'pid'=>'1', 'path'=>'0,1,' ), array( 'uid'=>'3', 'name'=>'经理赵', 'pid'=>'2', 'path'=>'0,1,2,' ), array( 'uid'=>'4', 'name'=>'员工赵', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ), array( 'uid'=>'5', 'name'=>'员工房', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ), array( 'uid'=>'6', 'name'=>'组长刘', 'pid'=>'3', 'path'=>'0,1,2,3,' ), array( 'uid'=>'7', 'name'=>'经理光杆', 'pid'=>'2', 'path'=>'0,1,2,' ), ); /** * 通过传入要查找的人的pid来递归查找他的下属,代码简陋,理解精神为主 * @param array $data 数组代替数据库中的数据 * @param integer $pid 父id * @param array &$result 结果数组,&保证变量常驻 * @param integer $deep 输出的分隔符--,无实际意义 * @return 树状结构数组 */ function getList( $data, $pid=0, &$result=array(), $deep = 0 ) { $deep+=2; foreach ( $data as $key => $val ) { if ( $pid == $val['pid'] ) { $result[] = "|".str_repeat("--", $deep).$val['name']; getList( $data, $val['uid'], $result, $deep ); } } return $result; } //调用函数输出结果 $res = getList($arr, 1); //查找副总王的下属 foreach($res as $key=>$val){ echo $val."\n"; }/*|----副总王|--------经理赵|------------组长刘|----------------员工赵|----------------员工房|--------经理光杆*/

还是上边的数据,现在要查一个员工的所有上级

/*** 传入员工的id,可以查找员工所属的上级* @param  array  $data     数组代替数据库中的数据* @param  integer $id      要查找的员工的id* @param  array   &$result 结果数组,&保证变量常驻* @return 结果*/
function getLink($data, $id=0, &$result=array()){ foreach ($data as $key => $val) { if ($val['uid'] == $id) { $result[] = $val['name']; getLink($data, $val['pid'], $result); } } return $result; } $res = getLink($arr , 5); //查找员工房的上级 foreach ($res as $key => $val) { echo $val." | "; } /* 员工房 | 组长刘 | 经理赵 | 副总王 | 总监张 | */

注:也可用全路径无限分类:数据中存了path,全路径可通过concat(path,",",id)算出来。优点:查询快,比递归快缺点:增加,移动分类时稍显复杂

转载于:https://www.cnblogs.com/KTblog/p/9025120.html

无限极分类中递归查找一个树结构相关推荐

  1. PHP无限极分类(递归)

    建表的时候,增加一个PID字段用来区别自己所属的分类 id pid name 1 0 汽车 2 1 欧拉 3 1 吉利 4 3 沃尔沃 5 1 大众 代码 /*** 递归实现无限极分类* @param ...

  2. php 引用 无限极分类,php 无限极分类(递归Or引用两种方法)

    项目中有很多地方需要用到无限极分类,之前数据量比较少,用递归方法虽然慢但是还可以接受,但是现在的数据量接近4万,php处理递归比较吃亏,递归100次就已经很难跑动了,无奈之下又得选择其它的方法,引用. ...

  3. php无限极递归概念,php无限极分类递归与普通

    1. 递归 public function getInfo(){ $data=$this->select(); $arr=$this->noLimit($data,$f_id=0,$lev ...

  4. php实现无限极分类递归调用

    工作中经常使用到使用php递归来进行数据库数据的树状显示,层级显示,无限极分类等 数据库设计的逻辑大概为 比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 如下: $array ...

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

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

  6. php 递归实现无限极分类和排序_无限极分类的两种方式,递归和引用

    说到无限极分类,比较常见的做法是在建表的时候,增加一个parnet_id字段用来区别自己所属的分类(是顶级分类还是子分类) 由于展示数据的时候,需要表达出这种所属关系,所以必然要在读取数据的时候进行一 ...

  7. php 实现无限极分类树 (引用和递归)

    这里首先介绍一下,什么是无限极分类? 无限极分类简单点说就是一个类可以分成多个子类,然后一个子类又可以分另外多个子类这样无限分下去,就好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一 ...

  8. php 递归无限极分类和层级展示(适用于权限管理和分类管理功能)

    php 递归无限极分类和层级展示(适用于权限管理和分类管理功能) 第一:权限管理层级展示 /*** 数组的合并,并加上html标识前缀* @param array $data* @param int ...

  9. PHP中无限极分类函数的实现

    在开发程序的时候,有时候,我们需要获取所有栏目(包括一级栏目.二级栏目.三级栏目等等),并按照父子关系形成树型结构.可以采取使用递归或者通过引用方式(php中引用类似C或者C++中的指针,只不过换一种 ...

最新文章

  1. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv5训练自己数据集(v6.0)
  2. 使用计算机的缺点英文作文,网络与计算机的好处与坏处英文作文
  3. linux 新建用户_使用Xshell和Xftp连接管理Linux服务器
  4. Dubbo 3.0 - 开启下一代云原生微服务
  5. Mangos自己制作装备
  6. 在ASP.NET中把数据POST到其他页面
  7. java 异常 最佳实践_关于JAVA异常处理的20个最佳实践
  8. Note cancel request的实现原理
  9. 工作总结3:axios里面的主要参数
  10. 用Java开发自己的Kubernetes控制器,想试试吗?
  11. oracle的事物起始于,oracle 学习笔记(十) 事务控制语句
  12. 细说业务逻辑(前篇)
  13. XP连接网络计算机未启动服务,XP搜索不到网络提示“请启动Windows零配置(WZC)服务”的解决方法...
  14. 7-4 华氏度转摄氏度 (5分) java
  15. Python爬虫大众点评字体加密评论采集!听说这个网站很难?
  16. js实现十大经典排序算法
  17. 服务器图片显示小方块,高手帮忙了!!验证码跟着敲好之后 服务器打开一个小方块里面空的!在线等!!!...
  18. 程序员写程序的逻辑思维,和外行人想当然的思维,到底有什么不同
  19. android 隐私泄露 路径,一种Android应用隐私泄露漏洞检测方法与流程
  20. 碳足迹软件市场现状研究分析-

热门文章

  1. FileProvider 在 Android N 上的应用
  2. python 常用内置函数_python常用内置函数使用|python基础教程|python入门|python教程...
  3. JZOJ 5489. 【清华集训2017模拟11.28】海明距离
  4. JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度
  5. oracle 数据库问题,ORACLE数据库常见问题汇总,oracle常见问题汇总
  6. 合作模式歌利亚机器人_智能时代挑战下的机器人教育新方向!
  7. 使用animate实现页面过度_很多人都在使用的开源CSS动画效果库——animate.css
  8. 为什么薄膜干涉的厚度要很小_薄膜干涉的薄膜为什么不能太厚?1.这里的厚是用什么来衡量的?2.假如一个厚为1mm的薄膜,是否薄?...
  9. 数据挖掘实验报告-关联规则算法实验
  10. Codeforces 1106F Lunar New Year and a Recursive Sequence (线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...