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

PHP 無限分類實作:Path 路徑法資料庫設計與樹狀輸出

     編輯:PHP 綜合知識

資料庫設計

CREATE TABLE tb_kind (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    pname VARCHAR(50),
    pid INT,
    path VARCHAR(200)
);

資料範例

id | pname      | pid | path
---|------------|-----|---------
1  | 新聞       | 0   | 0
2  | 視頻       | 0   | 0
3  | 圖片       | 0   | 0
4  | 博客       | 0   | 0
5  | 體育新聞   | 1   | 0-1
6  | 娛樂新聞   | 1   | 0-1
7  | 財經新聞   | 1   | 0-1
8  | 籃球新聞   | 5   | 0-1-5
9  | 足球新聞   | 5   | 0-1-5
10 | NBA        | 8   | 0-1-5-8
11 | CBA        | 8   | 0-1-5-8

核心邏輯:path 字串排序實現樹狀輸出

SELECT CONCAT(path, '-', id) AS abspath, id, pname, path
FROM tb_kind ORDER BY abspath;

輸出順序:

0-1
0-1-5
0-1-5-8
0-1-5-8-10
0-1-5-8-11
0-1-5-9
0-1-6
0-1-7
0-2
0-3
0-4

PHP 輸出縮排顯示

<?php
$conn = mysql_connect("localhost", "root", "root");
mysql_select_db("db_kind");
mysql_query("set names utf8");
$sql = "SELECT CONCAT(path,'-',id) AS abspath, id, pname, path FROM tb_kind ORDER BY abspath";
$rs = mysql_query($sql);
while ($row = mysql_fetch_assoc($rs)) {
    $level = count(explode("-", $row['path'])) - 1;
    $indent = str_repeat("---", $level);
    echo $indent . $row['pname'] . "<br>";
}
?>

輸出效果

新聞
---體育新聞
------籃球新聞
---------NBA
---------CBA
------足球新聞
---娛樂新聞
---財經新聞
視頻
圖片
博客

優點:單次查詢即可取得完整層級,無需遞迴查詢,效能極佳;缺點:移動節點需更新該節點及所有子孫的 path。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved