php創建無限級樹型菜單


大概步驟如下
step1:到數據庫取數據,放到一個數組,
step2:把數據轉化為一個樹型狀的數組,
step3:把這個樹型狀的數組轉為html代碼。
也可以將第二步和第三步合為一步。
詳細如下:
1、數據庫設計:

 

2、到數據庫取數據,放到數組:

我用的tp5

只展示部分核心代碼

       $menu=new Menu();
       $data=$menu->selects();

總之不管用什么方法把數據取出來就行

取出的數據格式就是這種原生的數組

 

3、把上一步的數據轉為樹型狀的數組代碼如下:

 public  function  getMenu($data,$pid,$deep=0)
   {
       //static $tree=array();
       $tree='';
       foreach ($data as $row) {
           if($row['parentid']==$pid){
              $row['deep']=$deep;
              $row['parentid']=$this->getMenu($data,$row['id'],$deep+1);
              $tree[]=$row;
              //$this->getMenu($data,$row['id'],$deep+1);
           }
       }
       return $tree;

   }

$deep 在這里沒啥用,代表樹的深度

最后輸出$tree的數據格式為:

4、把樹型狀數組轉為html代碼如下:

 function procHtml($menus)
       {
           $html = '';
           if(is_array($menus)) {
               foreach ($menus as $t) {
                   if ($t['parentid'] == '') {
                       $html .= "<li>{$t['name']}</li>";
                   } else {
                       $html .= "<li>" . $t['name'];
                       $html .= procHtml($t['parentid']);
                       $html = $html . "</li>";
                   }
               }
           }
           return $html ? '<ul>'.$html.'</ul>' : $html ;

       }
       echo procHtml($menus);

該函數跟上一步的代碼在一個類的同一個方法內

輸出的html的代碼格式為:
<ul>
<li>往事如風</li>
<li>水煮三國</li>
<li>技術學習
  <ul>
  <li>html</li>
  <li>css</li>
  <li>php
  <ul>
  <li>php基礎知識</li>
  <li>oop</li>
  <li>php安全</li>
5、也可以把第3和第4步的代碼合在一起,代碼如下:
public function getTree($data,$pid)
   {
       $html='';
       foreach($data as $row)
       {
           if($row['parentid']==$pid)
           {
               //父親找兒子
               $html.="<li>".$row['name'];
               $html.=$this->getTree($data,$row['id']);
               $html=$html."</li>";
           }
       }
       return $html?'<ul>'.$html.'</ul>':$html;
   }

推薦用這種,比較簡潔,此處的$data 就是從數據庫直接取出的數據

6、最后可以再加點css樣式(我沒加css),效果如下:

此文檔適合tp5開發的人員參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM