(修改递归错误)PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
2015-04-13 17:03
501 查看
应用场景:
通过web接口获取到无限分类部门的数据,部门数据解析出来的格式为一个二维数组。由于是自己临时写了一个简易的小框架,未加入缓存机制,因此只能一下把部门全部展示到页面上,可递归实现,但复杂度太高。
解决方法:
前提还是使用递归方法进行操作,只不过对通过接口获取的数据生成一个新的三维数组,然后进行递归操作,复杂度比较低。(若有大神有更加简单的方法,请解答,拜谢。)
实现方法:
1、处理通过接口获取到的数据。
2、对处理得到的三维数组进行递归操作,然后生成html。
最后实现的html效果如下。
PS:若有大神有更好的解决方法,求留言,拜谢。
更改:在工作继续中发现关系树的递归调用存在问题,修改如下。
通过web接口获取到无限分类部门的数据,部门数据解析出来的格式为一个二维数组。由于是自己临时写了一个简易的小框架,未加入缓存机制,因此只能一下把部门全部展示到页面上,可递归实现,但复杂度太高。
解决方法:
前提还是使用递归方法进行操作,只不过对通过接口获取的数据生成一个新的三维数组,然后进行递归操作,复杂度比较低。(若有大神有更加简单的方法,请解答,拜谢。)
实现方法:
1、处理通过接口获取到的数据。
/* * 将拉取到的部门数据处理成三维数组 * @param $dept array json解析出来的数组 * @return array * */ function dept_enarray($dept = array()){ $dept_array = array(); foreach($dept as $key => $val){ if($val['parentno']){ $dept_array[$val['parentno']][0][] = $val; }else{ $dept_array[0][] = $val; } } return $dept_array; }
2、对处理得到的三维数组进行递归操作,然后生成html。
/* * 构建组织部门树 * @param $orgdept array dept_enarray函数处理过的数组 * @param $html string html标签内容 * @param $lv int 当前的操作等级 * @param $parentarr array 拥有子部门的部门编码 * @param $orgarr array 原始传入的数组 * return string html * */ function get_depttree($orgdept,$html = '',$lv=1, $parentarr = '', $orgarr = ''){ $vl = $lv; if(!$orgarr) $orgarr = $orgdept; if(!$parentarr && $lv == 1) $parentarr = array_keys($orgdept); foreach($orgdept[0] as $key=>$val){ if(!in_array($val['deptno'],$parentarr)) $disvisiable = ' class="disvisiable" '; else $disvisiable = ''; if($lv == 1 ){ $html .= '<dl> <dt class="f'.$val['parentno'].' father" data-deptid="'.$val['deptno'].'" status="close"> <em><img src="/public/images/list-close.png"'.$disvisiable.'> </em> <span>'.$val['name'].'</span> <div class="addmenu"> <ul> <li class="addson">添加子部门</li> <li class="adduser">添加成员</li> <li>编辑部门</li> <li class="deldept">删除部门</li> </ul> </div> </dt>'; }else{ $html .= '<dd class="list'.($vl-1).' f'.$val['parentno'].' father" data-deptid="'.$val['deptno'].'" status="close"> <em><img src="/public/images/list-close.png"'.$disvisiable.'></em> <span>'.$val['name'].'</span> <div class="addmenu"> <ul> <li class="addson">添加子部门</li> <li class="adduser">添加成员</li> <li>编辑部门</li> <li class="deldept">删除部门</li> </ul> </div> </dd>'; } if(in_array($val['deptno'], $parentarr)){ $html = get_depttree($orgarr[$val['deptno']],$html,++$vl,$parentarr,$orgarr); } if($lv == 1) $html .= '</dl>'; } return $html; }
最后实现的html效果如下。
PS:若有大神有更好的解决方法,求留言,拜谢。
更改:在工作继续中发现关系树的递归调用存在问题,修改如下。
function get_depttree($orgdept,$html = '',$lv=1, $parentarr = '', $orgarr = ''){ $vl = $llv = $lv; if(!$orgarr) $orgarr = $orgdept; if(!$parentarr && $lv == 1){ $parentarr = array(); foreach($orgdept as $keys=>$vals){ if($keys !== 0) $parentarr[] = $keys; } } foreach($orgdept[0] as $key=>$val){ if(!in_array($val['deptno'],$parentarr)) $disvisiable = ' class="disvisiable" '; else $disvisiable = ''; if($lv == 1 ){ $html .= '<dl> <dt class="f'.$val['parentno'].' father " id="f'.$val['deptno'].'" data-fid="f'.$val['parentno'].'" data-deptid="'.$val['deptno'].'" status="close"> <em><img src="/public/images/list-close.png"'.$disvisiable.'> </em> <span>'.$val['name'].'</span> <div class="addmenu"> <ul> <li class="addson">添加子部门</li> <li class="adduser">添加成员</li> <li data-order="'.$val["order"].'" class="editdept">编辑部门</li> <li class="deldept">删除部门</li> </ul> </div> </dt>'; }else{ $html .= '<dd class="list'.$vl.' f'.$val['parentno'].' father" id="f'.$val['deptno'].'" data-fid="f'.$val['parentno'].'" data-deptid="'.$val['deptno'].'" status="close"> <em><img src="/public/images/list-close.png"'.$disvisiable.'></em> <span>'.$val['name'].'</span> <div class="addmenu"> <ul> <li class="addson">添加子部门</li> <li class="adduser">添加成员</li> <li data-order="'.$val["order"].'" class="editdept">编辑部门</li> <li class="deldept">删除部门</li> </ul> </div> </dd>'; } if(in_array($val['deptno'], $parentarr) && isset($orgarr[$val['deptno']])){ $html = get_depttree($orgarr[$val['deptno']],$html,++$vl,$parentarr,$orgarr); } $vl = $llv; if($lv == 1) $html .= '</dl>'; } return $html; }
相关文章推荐
- php递归实现无限分类生成下拉列表的函数
- PHP不用递归实现无限分类数据的树形格式化 5行9行代码修改
- php中递归无限分类之-通过子栏目查找父栏目
- php递归实现无限分类生成下拉列表
- php递归实现无限分类生成下拉列表的函数
- php实现无限级分类,通过循环和递归实现
- php实现无限级分类查询(递归、非递归)
- 利用php递归实现无限分类 格式化数组的详解
- PHP 无限分类三种方式 非函数的递归调用!
- PHPTree――php快速生成无限级分类
- PHP递归实现无限级分类
- php递归无限分类原理
- PHP递归实现无限分类数组处理
- PHP递归实现无限级分类
- php实战之使用递归读取商品无限分类
- php递归无限级分类【先序遍历算】,获取任意节点下所有子孩子
- php不用递归完成无限分类,从表设计入手完整演示过程
- PHP删除无限分类并同时删除它下面的所有子分类的方法
- php 无限分类递归及其排序详细解读
- PHP 无限分类三种方式,非函数的递归调用![兄弟连]