PHP實現無限分類

2022-03-12 19:59:40 字數 3656 閱讀 3219

無限分類

遞迴無限級分類是一種設計技巧,在開發中經常使用,例如:**目錄、部門結構、文章分類。筆者覺得它在對於設計表的層級結構上面發揮很大的作用,比如大家在一些平台上面,填寫邀請人,它就是一種上下級的關係,上級會有多個下級,下級又會有自己的分支,大多數都是利用遞迴的思想去實現。話不多說,首先來溫故一下遞迴的實現。

遞迴(程式呼叫自身的程式設計技巧):

1、$_globals[result]

2、static $result

3、引數引用&

舉例:遍歷1-10

$i=0; 

function

deeploop

( $i ) } 

function

deeploop

( )

}  

function

deeploop

( &$i=0 )

}  

無限分類實現:

1、表設計設定父id 頂級父id設為0 建立族譜樹;每乙個分類都需記錄它的父級id。

id pid catename cateorder createtime ( 主鍵id,父id,分類name,分類排序,建立時間)

2、全路徑無限分類(以乙個欄位將所有父級id按順序記錄下來)

id path catename cateorder createtime ( 主鍵id,逗號分隔的順序排列父id,分類name,分類排序,建立時間)

優缺點:

全路徑查詢方便;增加,移動分類時資料維護稍顯複雜;

舉例:**目錄

分類表:

#父級id遞迴法 

create

table

`deepcate`(

`id`

int(11) not

null auto_increment primary

key,

`pid`

int(11) not

null

default

0,`catename`

char(25) not

null,

`cateorder`

int(6) ,

`createtime`

date

)engine=innodb

default

charset=utf8;

//資料 

insert

into

`deepcate`

values(1,0,'',null,'2016-11-01'),

( 2,1,'美女',null,'2016-11-01'),

( 3,1,'新聞',null,'2016-11-01'),

( 4,2,'足球寶貝',null,'2016-11-01'),

( 5,2,'日韓明星',null,'2016-11-01'),

( 6,5,'美女寫真',null,'2016-11-01');

#全路徑 

create

table

`qljcate` (

`id`

int(11) not

null,

`path`

char(255) ,

`catename`

char(25) not

null,

`cateorder`

int(6),

`createtime`

date

)engine=innodb

default

charset=utf8;

insert

into

`qljcate`

values(1,null,'',null,'2016-11-01'),

( 2,1,'美女',null,'2016-11-01'), (3,1,2,'足球寶貝',null,'2016-11-01'), (4,1,2,'日韓明星',null,'2016-11-01'),

(5,1,2,4,'美女寫真',null,'2016-11-01');

#父級id實現法(資料庫連線操作此處就不提及,提供思路,實現看個人調整)

function

getcatepath

( $id,&$result=array() )

"; $query = mysql_query( $sql ); 

$row = mysql_fetch_assoc( $query ); 

if( $row ) 

return

$result; 

} #全路徑實現

function

getcatepath

( $id )

) order by id asc"; 

$query = mysql_query( $sql ); 

$row = mysql_fetch_assoc( $query ); 

return

$result; 

} 移動分類不能移到自己及其子類下面;刪除分類 (只能刪除最底層的分類,及不含子類的分類;換言之,只能從最底層刪起)

1)、思考型別下所有的分類?

#pid 父級id實現法

function

getallcate

( $id,&$result=array() )

)"; 

$query = mysql_query( $sql ); 

$row = mysql_fetch_assoc( $query ); 

if( mysql_num_rows($row)>0 ) 

$id = implode(',',$idlist); 

getallcate( $id,$result ); 

} $result = array_unique( $result ); 

return

$result; 

} 此類方法比較適用於查詢所在父分類下所有的書籍、文章。。。當然,全路徑可以直接獲取,就不再此提出了。

2)、上述的這些查詢運算元據庫的操作可能過於頻繁了,也是可以將資料全部查詢出來(一般這種無限分類資料不會很多的),再用程式處理。

如:工作中我們會遇到聯動的情況,如位址的選擇 省市區。

#獲取樹形結構資料

function

gettree

( $data=array() )

$level0 = array(); //只需取出頂級的資料(判斷父級id是否等於0 ,子元素放入父元素下面)

foreach( $data

as$val) 

else 

} return

$level0; 

} 得到樹形接結構資料,可呼叫下面方法生成ul列表(可調整**,修改你想要的頁面效果):

#顯示分類列表

function

setulhtml

( $data,$type="checkbox",&$state=1 )

return

$ul; 

} 實際操作中,我們可以根據實際情況設計合理的表結構。

舉個例項,連鎖門店實現商品的管理,門店的賬戶設定就會存在上下級關係,根據**點的分割槽可能存在這種下級擁有自己下級,那麼採用這種無限分類的方法就比較靈活面對這種 關係體系,只需設定每個賬戶等級,就能對不同的門店設定許可權分配。

php實現無限分類

access public param pid 節點的id param array 返回該節點的所有後代節點 public function list cate pid 0 access private param arr array 要遍歷的陣列 param pid 節點的pid,預設為0,表示從...

PHP無限分類

定義乙個陣列 或者從資料庫裡取出 data array array id 1,pid 0,cname 數碼 array id 2,pid 0,cname 家用電器 array id 3,pid 0,cname 電腦 array id 4,pid 0,cname 服裝 array id 5,pid 0...

PHP遞迴實現無限級分類

在一些複雜的系統中,要求對資訊欄目進行無限級的分類,以增強系統的靈活性。那麼php是如何實現無限級分類的呢?我們在本文中使用遞迴演算法並結合mysql資料表實現無限級分類。在一些複雜的系統中,要求對資訊欄目進行無限級的分類,以增強系統的靈活性。那麼php是如何實現無限級分類的呢?我們在本文中使用遞迴...