应用场景:
通过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;
}/*
* 构建组织部门树
* @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;
}
PS:若有大神有更好的解决方法,求留言,拜谢。
PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
原文:http://blog.csdn.net/kissxia/article/details/45028791