(修改递归错误)PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
来源:互联网 发布:ug编程没刀库的刀具号 编辑:程序博客网 时间:2024/05/29 19:50
应用场景:
通过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;}
0 0
- (修改递归错误)PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
- php 无限分类 递归
- PHP递归无限分类
- php 无限递归分类
- php实现无限级分类,通过循环和递归实现
- php递归实现无限级分类树(牛逼)
- php递归无限级分类【先序遍历算】,获取任意节点下所有子孩子
- php递归无限级分类【先序遍历算】,获取任意节点下所有子孩子
- PHP无限级分类实现(递归+非递归)
- PHP无限级分类实现(递归+非递归)
- PHP无限级分类实现(递归+非递归)
- PHP无限级分类实现(递归+非递归)
- PHP无限级分类实现(递归+非递归)
- php实现无限级分类查询(递归、非递归)
- PHP无限级分类实现(递归+非递归)
- php+mysql无限级分类(非递归)
- PHP递归查询的无限级分类
- php+mysql无限级分类(非递归)
- php trim 学习
- win7 共享需要开启哪些服务
- linux下用代码获取系统的IP与MAC
- 其他两种绑定ListView数据的方式
- 一、链路层基础知识……
- (修改递归错误)PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
- volatile extern struct
- vector使用总结
- cocos2d-x 3.4版本 Android ndk-gdb真机调试环境搭建
- caffe之CIFAR-10与dropout
- 下载bing图片并设置成桌面壁纸
- hdu 1507 Uncle Tom's Inherited Land*(二分图最大匹配)
- 等高列布局、水平垂直居中与置顶页脚
- 快速幂与快速矩阵幂