A-A+
	PHP怎样生成树形菜单
一个简单的PHP生成树形菜单的代码,使用的是PHP递归的方法,这也是小虎博客刚刚接手的一个项目中一项较为复杂的应用,PHP生成树形菜单只是一个小的片段代码,而和juqery结合就较为麻烦了说,好了,先简单说一下数组库中的结构,其pid为顶级ID,parent为子分类,而parent则是对应pid的,看到这里经常玩PHP或者数据库的应该明白了吧,就是一个递归出来的树形菜单。
从网上找了许多代码,都用不了,也有可能跟自己的数据库有关系吧,还好从51CTO上面找了怎么一段简短的代码,还不错的说。
- <?php
 - header("Content-type:text/html; charset=UTF-8");
 - $mixTree = array();
 - /*
 - * 每个结果中的重点数据两个一个是id一个是指向其父结点id的parent
 - */
 - $mixTree[] = array('id'=>0,'val'=>'顶级菜单1','parent'=>-1);
 - $mixTree[] = array('id'=>1,'val'=>'顶级菜单2','parent'=>-1);
 - $mixTree[] = array('id'=>2,'val'=>'顶级菜单1下的二级菜单1','parent'=>0);
 - $mixTree[] = array('id'=>3,'val'=>'顶级菜单1下的二级菜单2','parent'=>0);
 - $mixTree[] = array('id'=>4,'val'=>'顶级菜单2下的二级菜单1','parent'=>1);
 - $mixTree[] = array('id'=>5,'val'=>'顶级菜单1下的二级菜单2下的三级菜单1','parent'=>3);
 - /*
 - * 通过二维数组把上面的数据挂载成树
 - */
 - $treeDatas = array();
 - foreach($mixTree as $nodeDatas){
 - if($nodeDatas['parent']==-1){
 - $treeDatas[-1][]=$nodeDatas;
 - }else{
 - $treeDatas[$nodeDatas['parent']][]=$nodeDatas;
 - }
 - }
 - /*
 - * 遍历打印其父结点及其子结点
 - */
 - function traverSesing($nodeDatas,$treeDatas){
 - echo $nodeDatas['val'];
 - if(!emptyempty($treeDatas[$nodeDatas['id']])&& is_array($treeDatas[$nodeDatas['id']])){
 - echo '<ul>';
 - foreach($treeDatas[$nodeDatas['id']] as $childNodeDatas){
 - echo '<li>';
 - traverSesing($childNodeDatas, $treeDatas);
 - echo '</li>';
 - }
 - echo '</ul>';
 - }
 - }
 - echo '<ul>';//www.xiaohuboke.com
 - foreach($treeDatas[-1] as $nodeDatas){
 - echo '<li>';
 - traverSesing($nodeDatas, $treeDatas);
 - echo '</li>';
 - }
 - echo '</ul>';
 
只是这段原生的代码对于数据库上面的优化不是很好,我们可以给个条件或者直接使用 unset 来释放内存来进行优化,我这里因为是一个简单的输出树形菜单片段,一共有六级,所以直接就判断了六层的输出,PHP生成菜单树形效果如下:
这里小小的说明一下,PHP递规菜单树的代码网上有许多,我这里找的只是适合自己的数据库结构而已,大家可以从网上找适合自己的片段代码,如果是多级菜单输出的话,建议使用 unset 来进行内存的优化,另外,如果使用的是 thinkphp 的话,其官网有不少的PHP菜单树代码片段。
