递归 ---无限极分类中递归查找一个树结构
2016-09-06 10:53
260 查看
递归的注意点:
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)算出来。
表中需要有一个path字段来进行路径查询 类似 'a-b-c-d';
优点:查询快,比递归快
缺点:增加,移动分类时稍显复杂
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)算出来。
表中需要有一个path字段来进行路径查询 类似 'a-b-c-d';
优点:查询快,比递归快
缺点:增加,移动分类时稍显复杂
相关文章推荐
- 无限极分类中递归查找一个树结构
- 一个无限极分类的类(递归的思想)
- 树结构(递归方法实现无限极分类)
- 递归无限极查找上级分类
- 分享一个牛逼的PHP无限极分类生成树方法,巧用引用(转)
- 无限极分类递归排序
- 自己写的一个根据结点名称查找CTreeCtrl树中对应结点的方法(用的是递归思想)
- 一个递归和非递归实现二分查找的代码
- C#,net查找一个Node所有子节点,演示递归调用
- ThinkPHP学习笔记(十一)自动填充一个无限极分类
- 预排序遍历树算法(非递归无限极分类算法)
- 【转贴】如何在C#中查找树结构的一个节点
- c# 菜单无限极分类-利用递归
- 怎样创建一个独一无二的包名及及查找有可能隐藏于目录结构中类
- 一个php从数据库取出的无限极递归多维数组
- 一个连通图,采用邻接表作为存储结构,设计一个算法从顶点v出发的深度优化遍历的非递归过程
- 预排序遍历树算法(非递归无限极分类算法)
- 自己写的一个根据结点名称查找CTreeCtrl树中对应结点的方法(用的是递归思想)
- 一个高手写的递归遍历多层结构的存储过程(转载)
- asp.net下拉框无限极分类(递归)(项目是nicpetshop代码生成器生成的)