function get_tree($data, $id_key = 'id', $pid_key = 'pid', $pid = 0, $deep = 0)
{
$tree = [];
foreach ($data as $row) {
if ($row[$pid_key] == $pid) {
$row['deep'] = $deep;
$row['child'] = get_tree($data, $id_key, $pid_key, $row[$id_key], $deep + 1);
$tree[] = $row;
}
}
return $tree;
}
二、創建無限級樹形菜單
大概步驟如下:
step1:到數據庫取數據,放到一個數組,
step2:把數據轉化爲一個樹型狀的數組,
step3:把這個樹型狀的數組轉爲html代碼。
也可以將第二步和第三步合爲一步。
詳細如下:
- 數據庫設計:
- 到數據庫取數據,放到數組:
$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>
- 也可以把第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 就是從數據庫直接取出的數據
- 最後可以再加點css樣式(我沒加css),效果如下: