php:樹(shù)形結(jié)構(gòu)的算法

字號(hào):


    產(chǎn)品分類,多級(jí)的樹(shù)狀結(jié)構(gòu)的論壇,郵件列表等許多地方我們都會(huì)遇到這樣的問(wèn)題:如何存儲(chǔ)多級(jí)結(jié)構(gòu)的數(shù)據(jù)?在PHP的應(yīng)用中,提供后臺(tái)數(shù)據(jù)存儲(chǔ)的通常是關(guān)系型數(shù)據(jù)庫(kù),它能夠保存大量的數(shù)據(jù),提供高效的數(shù)據(jù)檢索和更新服務(wù)。然而關(guān)系型數(shù)據(jù)的基本形式是縱橫交錯(cuò)的表,是一個(gè)平面的結(jié)構(gòu),如果要將多級(jí)樹(shù)狀結(jié)構(gòu)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)里就需要進(jìn)行合理的翻譯工作。接下來(lái)我會(huì)將自己的所見(jiàn)所聞和一些實(shí)用的經(jīng)驗(yàn)和大家探討一下。層級(jí)結(jié)構(gòu)的數(shù)據(jù)保存在平面的數(shù)據(jù)庫(kù)中基本上有兩種常用設(shè)計(jì)方法:毗鄰目錄模式(adjacency list model)預(yù)排序遍歷樹(shù)算法(modified preorder tree traversal algorithm)我不是計(jì)算機(jī)專業(yè)的,也沒(méi)有學(xué)過(guò)什么數(shù)據(jù)結(jié)構(gòu)的東西,所以這兩個(gè)名字都是我自己按照字面的意思翻的,如果說(shuō)錯(cuò)了還請(qǐng)多多指教。這兩個(gè)東西聽(tīng)著好像很嚇人,其實(shí)非常容易理解。這里我用一個(gè)簡(jiǎn)單食品目錄作為我們的示例數(shù)據(jù)。
    我們的數(shù)據(jù)結(jié)構(gòu)是這樣的:
    Food
    |
    |---Fruit
    | |
    | |---Red
    | | |
    | | |--Cherry
    | |
    | |---Yellow
    | |
    | |--Banana
    |
    |---Meat
    |
    |--Beef
    |
    |--Pork
    為了照顧那些英文一塌糊涂的PHP愛(ài)好者
    Food:食物
    Fruit:水果
    Red:紅色
    Cherry:櫻桃
    Yellow:黃色
    Banana:香蕉
    Meat:肉類
    Beef:牛肉
    Pork:豬肉