無限分類の場合、PHP はインターフェイス
を介してすべてのカテゴリを抽出した後、分類ツリーを生成します。 アプリケーション シナリオ:
Web を通じて無制限の分類部門のデータを取得します。インターフェイス、部門 解析されるデータの形式は 2 次元配列です。キャッシュ機構を追加せずに簡単な小さなフレームワークを一時的に作成したため、ページ上のすべての部門を一度に表示することしかできません。再帰的に実装できますが、複雑すぎます。
解決策:
前提として、操作には再帰的メソッドを使用しますが、取得したデータに対して新しいメソッドを生成します。インターフェイスを介して 3 次元配列を作成し、再帰的な操作を実行するため、複雑さは比較的低くなります。 (もっと簡単な方法をご存知の方がいらっしゃいましたら、回答お願いします。)
実装方法:
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: 誰かがより良い解決策を持っている場合は、メッセージを残してください。ありがとうございます。