首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 無限層級地區分類排序演算法:從扁平陣列生成樹狀結構

     編輯:PHP 綜合知識

問題定義

給定扁平陣列,每筆資料包含 [parent_id, name],需輸出縮排顯示的階層結構:

河北
-保定
--涿州
北京
-海澱
--中關村

資料結構

$array = array(
    0 => array("", "河北"),
    1 => array("", "北京"),
    2 => array(0, "保定"),
    3 => array(1, "海澱"),
    4 => array(3, "中關村"),
    5 => array(2, "涿州")
);

核心演算法:路徑編碼 + 字典序排序

  1. 遍歷陣列,為每節點構建「祖先路徑字串」,如 0|2|5| 表示 根→0→2→5。
  2. 對路徑字串進行 asort(),字典序天然符合樹的前序遍歷順序。
  3. 根據路徑中 | 的數量計算層級,輸出對應縮排符號。

完整函數

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)。
  • 輸出 HTML <ul><li> 結構供前端樹狀元件使用。
  • 加入 listorder 欄位實現同層自定義排序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved