无限极分类中递归查找一个树结构
问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级。
解决:递归实现无限分类思想,每一个员工存入其所属的上级的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来递归查找他的下属,代码简陋,理解精神为主 * @paramarray$data数组代替数据库中的数据 * @paraminteger $pid父id * @paramarray&$result 结果数组,&保证变量常驻 * @paraminteger $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,可以查找员工所属的上级 * @paramarray$data数组代替数据库中的数据 * @paraminteger $id要查找的员工的id * @paramarray&$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)算出来。
优点:查询快,比递归快
缺点:增加,移动分类时稍显复杂
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 子龙老师语录
- 一些小日子
- 周一(十一)
- jQuery插件
- 07/22【晨读感悟】保持好奇心,生活才有无限可能
- 百度云极速下载,来体验飞的感觉,还可以看最新动漫的百度云视频哦
- 《通往财富自由之路》人生的终极问题到底是什么()
- 极简主义|极简主义 简记
- 星际无限|星际无限 | 官方推出Filecoin MinerX奖学金计划,吸引中小型Filecoin矿工