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.xiariboke.net
- foreach($treeDatas[-1] as $nodeDatas){
- echo '<li>';
- traverSesing($nodeDatas, $treeDatas);
- echo '</li>';
- }
- echo '</ul>';
只是这段原生的代码对于数据库上面的优化不是很好,我们可以给个条件或者直接使用 unset 来释放内存来进行优化,我这里因为是一个简单的输出树形菜单片段,一共有六级,所以直接就判断了六层的输出,PHP生成菜单树形效果如下:
这里小小的说明一下,PHP递规菜单树的代码网上有许多,我这里找的只是适合自己的数据库结构而已,大家可以从网上找适合自己的片段代码,如果是多级菜单输出的话,建议使用 unset 来进行内存的优化,另外,如果使用的是 thinkphp 的话,其官网有不少的PHP菜单树代码片段。
一直用WP,才不管他怎么形成的呢,呵呵
学习了