溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP+MySQL中的無(wú)限分類方法有哪些

發(fā)布時(shí)間:2021-08-09 20:23:39 來(lái)源:億速云 閱讀:143 作者:chen 欄目:編程語(yǔ)言

這篇文章主要介紹“PHP+MySQL中的無(wú)限分類方法有哪些”,在日常操作中,相信很多人在PHP+MySQL中的無(wú)限分類方法有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP+MySQL中的無(wú)限分類方法有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

  第一種方法

  這種方法是很常見(jiàn)、很傳統(tǒng)的一種,先看表結(jié)構(gòu)

  表:category

  idint主鍵,自增

  namevarchar分類名稱

  pidint父類id,默認(rèn)0

  頂級(jí)分類的pid默認(rèn)就是0了。當(dāng)我們想取出某個(gè)分類的子分類樹的時(shí)候,基本思路就是遞歸,當(dāng)然,出于效率問(wèn)題不建議每次遞歸都查詢數(shù)據(jù)庫(kù),通常的做法是先講所有分類取出來(lái),保存到PHP數(shù)組里,再進(jìn)行處理,最后還可以將結(jié)果緩存起來(lái)以提高下次請(qǐng)求的效率。

  先來(lái)構(gòu)建一個(gè)原始數(shù)組,這個(gè)直接從數(shù)據(jù)庫(kù)中拉出來(lái)就行:

  $categories=array(

  array('id'=>1,'name'=>'電腦','pid'=>0),

  array('id'=>2,'name'=>'手機(jī)','pid'=>0),

  array('id'=>3,'name'=>'筆記本','pid'=>1),

  array('id'=>4,'name'=>'臺(tái)式機(jī)','pid'=>1),

  array('id'=>5,'name'=>'智能機(jī)','pid'=>2),

  array('id'=>6,'name'=>'功能機(jī)','pid'=>2),

  array('id'=>7,'name'=>'超級(jí)本','pid'=>3),

  array('id'=>8,'name'=>'游戲本','pid'=>3),

  );

  目標(biāo)是將它轉(zhuǎn)化為下面這種結(jié)構(gòu)

  電腦

  —筆記本

  ——-超級(jí)本

  ——-游戲本

  —臺(tái)式機(jī)

  手機(jī)

  —智能機(jī)

  —功能機(jī)

  用數(shù)組來(lái)表示的話,可以增加一個(gè)children鍵來(lái)存儲(chǔ)它的子分類:

  array(

  //1對(duì)應(yīng)id,方便直接讀取

  1=>array(

  'id'=>1,

  'name'=>'電腦',

  'pid'=>0,

  children=>array(

  &array(

  'id'=>3,

  'name'=>'筆記本',

  'pid'=>1,

  'children'=>array(

  //此處省略

  )

  ),

  &array(

  'id'=>4,

  'name'=>'臺(tái)式機(jī)',

  'pid'=>1,

  'children'=>array(

  //此處省略

  )

  ),

  )

  ),

  //其他分類省略

  )

  處理過(guò)程:

  $tree=array();

  //第一步,將分類id作為數(shù)組key,并創(chuàng)建children單元

  foreach($categoriesas$category){

  $tree[$category['id']]=$category;

  $tree[$category['id']]['children']=array();

  }

  //第二部,利用引用,將每個(gè)分類添加到父類children數(shù)組中,這樣一次遍歷即可形成樹形結(jié)構(gòu)。

  foreach($treeas$k=>$item){

  if($item['pid']!=0){

  $tree[$item['pid']]['children'][]=&$tree[$k];

  }

  }

  print_r($tree);

  打印結(jié)果如下:

  Array

  (

  [1]=>Array

  (

  [id]=>1

  [name]=>電腦

  [pid]=>0

  [children]=>Array

  (

  [0]=>Array

  (

  [id]=>3

  [name]=>筆記本

  [pid]=>1

  [children]=>Array

  (

  [0]=>Array

  (

  [id]=>7

  [name]=>超級(jí)本

  [pid]=>3

  [children]=>Array

  (

  )

  )

  [1]=>Array

  (

  [id]=>8

  [name]=>游戲本

  [pid]=>3

  [children]=>Array

  (

  )

  )

  )

  )

  [1]=>Array

  (

  [id]=>4

  [name]=>臺(tái)式機(jī)

  [pid]=>1

  [children]=>Array

  (

  )

  )

  )

  )

  [2]=>Array

  (

  [id]=>2

  [name]=>手機(jī)

  [pid]=>0

  [children]=>Array

  (

  [0]=>Array

  (

  [id]=>5

  [name]=>智能機(jī)

  [pid]=>2

  [children]=>Array

  (

  )

  )

  [1]=>Array

  (

  [id]=>6

  [name]=>功能機(jī)

  [pid]=>2

  [children]=>Array

  (

  )

  )

  )

  )

  [3]=>Array

  (

  [id]=>3

  [name]=>筆記本

  [pid]=>1

  [children]=>Array

  (

  [0]=>Array

  (

  [id]=>7

  [name]=>超級(jí)本

  [pid]=>3

  [children]=>Array

  (

  )

  )

  [1]=>Array

  (

  [id]=>8

  [name]=>游戲本

  [pid]=>3

  [children]=>Array

  (

  )

  )

  )

  )

  [4]=>Array

  (

  [id]=>4

  [name]=>臺(tái)式機(jī)

  [pid]=>1

  [children]=>Array

  (

  )

  )

  [5]=>Array

  (

  [id]=>5

  [name]=>智能機(jī)

  [pid]=>2

  [children]=>Array

  (

  )

  )

  [6]=>Array

  (

  [id]=>6

  [name]=>功能機(jī)

  [pid]=>2

  [children]=>Array

  (

  )

  )

  [7]=>Array

  (

  [id]=>7

  [name]=>超級(jí)本

  [pid]=>3

  [children]=>Array

  (

  )

  )

  [8]=>Array

  (

  [id]=>8

  [name]=>游戲本

  [pid]=>3

  [children]=>Array

  (

  )

  )

  )

  優(yōu)點(diǎn):關(guān)系清楚,修改上下級(jí)關(guān)系簡(jiǎn)單。

  缺點(diǎn):使用PHP處理,假如分類數(shù)量龐大,效率也會(huì)降低。

  PHP+MySQL無(wú)限分類有哪些方法

  第二種方法

  這種方法是在表字段中增加一個(gè)path字段:

  表:category

  idint主鍵,自增

  namevarchar分類名稱

  pidint父類id,默認(rèn)0

  pathvarchar路徑

  示例數(shù)據(jù):

  idnamepidpath

  1電腦00

  2手機(jī)00

  3筆記本10-1

  4超級(jí)本30-1-3

  5游戲本30-1-3

  path字段記錄了從根分類到上一級(jí)父類的路徑,用id+’-'表示。

  這種方式,假設(shè)大家要查詢電腦下的所有后代分類,只需要一條sql語(yǔ)句:

  selectid,name,pathfromcategorywherepathlike(selectconcat(path,’-',id,’%')aspathfromcategorywhereid=1);

  結(jié)果:

  +—-+———–+——-+

  |id|name|path|

  +—-+———–+——-+

  |3|筆記本|0-1|

  |4|超級(jí)本|0-1-3|

  |5|游戲本|0-1-3|

  +—-+———–+——-+

  這種方式也被很多人所采納,我總結(jié)了下:

  優(yōu)點(diǎn):查詢?nèi)菀?,效率高,path字段可以加索引。

  缺點(diǎn):更新節(jié)點(diǎn)關(guān)系麻煩,需要更新所有后輩的path字段。

到此,關(guān)于“PHP+MySQL中的無(wú)限分類方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI