您的位置:首页 > 编程语言 > PHP开发

(修改递归错误)PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树

2015-04-13 17:03 501 查看
应用场景:

通过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: