給定扁平陣列,每筆資料包含 [parent_id, name],需輸出縮排顯示的階層結構:
河北 -保定 --涿州 北京 -海澱 --中關村
$array = array(
0 => array("", "河北"),
1 => array("", "北京"),
2 => array(0, "保定"),
3 => array(1, "海澱"),
4 => array(3, "中關村"),
5 => array(2, "涿州")
);
0|2|5| 表示 根→0→2→5。asort(),字典序天然符合樹的前序遍歷順序。| 的數量計算層級,輸出對應縮排符號。function typeArray($array) {
$con = null;
$na = array();
// 1. 建立路徑編碼
foreach ($array as $k => $v) {
$parent = $v[0];
$na[$k] = is_numeric($parent) ? ($na[$parent] . $k . "|") : ($k . "|");
}
// 2. 字典序排序
asort($na);
// 3. 輸出縮排
foreach ($na as $k => $path) {
$level = substr_count($path, "|"); // 層級 = 分隔符數量
$con .= str_repeat("-", $level - 1) . $array[$k][1] . "\n";
}
return $con;
}
| 優點 | 缺點 |
|---|---|
| 無需遞迴,單次遍歷 + 排序即可 | 依賴資料已按父節點在前順序排列(父 ID < 子 ID) |
| 記憶體佔用低,適合萬筆以內資料 | 超大資料量排序效能下降,建議改用遞迴 + 快取或資料庫 CTE |
parent_id = 0 或 null)。<ul><li> 結構供前端樹狀元件使用。listorder 欄位實現同層自定義排序。