本範例展示 xzn_html_tree 類別處理非循序、多層級節點註冊的能力。節點 ID 採用點號分隔層級(如 0.0.0.2),註冊順序刻意打亂,驗證 ksort() 排序與遞迴輸出的正確性。
<?php
require_once 'xzn/html/tree.php';
$tree = new Tree;
$tree->jspath = 'js/outline.js'; // 前端摺疊 JS 路徑
// 亂序註冊測試
$tree->set('0', 'a1', 'url');
$tree->set('0.0.0', 'aaa', 'url');
$tree->set('0.0.0.0', 'bbb', 'url');
$tree->set('0.0.0.2', 'ccc', ''); // 無連結節點
$tree->set('0.0.0.1', 'ddd', 'url'); // 同層較早註冊
$tree->set('0.0', 'eee', 'url'); // 覆蓋測試:同 ID 後註冊生效
$tree->set('1', 'ff', 'url');
// 輸出樹狀結構
$tree->display();
?>
set(),後者覆蓋前者(陣列鍵值特性)。0.0.0.0 時,父層 0、0.0、0.0.0 若不存在會自動建立空節點。ksort() 確保同層節點按 ID 字典序輸出,不受註冊順序影響。value 為空字串時,輸出純文字而非 <a> 標籤。eval() 動態建立陣列路徑存在注入風險,建議改用 array_walk_recursive 或參考指標迴圈。outline.js,現代瀏覽器相容性差,建議重寫為標準 <details>/<summary> 或 Vue/Alpine.js 元件。TreeNode 增加 $attributes 陣列支援。此測試範例可作為重構前的行為基準,確保新版本輸出結構與舊版一致,實現平滑遷移。