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 .= '
-
'.$val['name'].'
'; }else{ $html .= '
-
'.$val['name'].'
'; } if(in_array($val['deptno'], $parentarr)){ $html = get_depttree($orgarr[$val['deptno']],$html,++$vl,$parentarr,$orgarr); } if($lv == 1) $html .= '
'; } return $html;}
最後實現的html效果如下。
PS:若有大神有更好的解決方案,求留言,拜謝。