在後台管理系統中,無限級分類樹是常見需求。本文以 jQuery 插件 ZTree 為前端渲染引擎,結合 PHP 遞歸算法從數據庫構建 JSON 數據,完整演示從前端配置到後端遞歸查詢的落地過程。
<script src="__PUBLIC__/js/jquery-1.4.4.min.js"></script>
<script src="__PUBLIC__/js/jquery.ztree.core-3.5.js"></script>
<link rel="stylesheet" href="__PUBLIC__/css/zTreeStyle/zTreeStyle.css" type="text/css">
<link rel="stylesheet" href="__PUBLIC__/css/zTree.css" type="text/css">
<div class="content_wrap" style="background:#666;">
<div class="zTreeDemoBackground left">
<ul id="treeDemo" class="ztree"></ul>
</div>
</div>
<div class="content-text" id="text"></div>
單獨 JS 文件 ztreeonload.js 中完成配置與異步加載:
var setting = {
isSimpleData: true, // 採用簡單 Array 格式
showLine: true, // 顯示節點連線
checkable: true, // 顯示複選框
callback: { onClick: zTreeOnClick }
};
var zNodes;
$.ajax({
url: "/admin.php/Ztree", // 後端接口(ThinkPHP 路由示例)
type: "get",
async: false,
dataType: "json",
success: function(data) { zNodes = data; },
error: function() { alert('請求失敗'); }
});
$(document).ready(function() {
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});
<?php
// 入口:構建頂級節點數組並輸出 JSON
$arr = array();
$arr_str0 = array("name" => '函數庫查詢', 'children' => $this->SelectSon(1)); // Pid=1
$arr_str1 = array("name" => '數據庫查詢', 'children' => $this->SelectSon(2)); // Pid=2
array_push($arr, $arr_str0, $arr_str1);
echo json_encode($arr);
// 遞歸查找子節點
private function SelectSon($Pid) {
$m = M('ztree');
if ($info = $m->where("Pid='$Pid'")->select()) {
$data = array();
for ($i = 0; $i < count($info); $i++) {
$da = array(
"name" => $info[$i]['name'],
'children' => $this->SelectSon($info[$i]['id']) // 遞歸
);
array_push($data, $da);
}
return $data; // 同級子節點一次性返回
}
return null;
}
?>
children 結構規律。Pid 為鍵遞歸查詢,將查詢結果組裝為 {name, children} 結構,最終 json_encode 輸出。M() 操作模型,但純 PHP 中只需替換為 PDO/MySQLi 查詢,遞歸邏輯完全一致。掌握「遞歸查詢 + JSON 組裝 + 前端異步初始化」這一模式,即可輕鬆應對任意深度的樹形結構展示需求。