PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
应用场景:
通过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:若有大神有更好的解决方法,求留言,拜谢。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。