溫馨提示×

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

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

php如何實(shí)現(xiàn)無限級(jí)分類查詢

發(fā)布時(shí)間:2021-06-25 13:40:07 來源:億速云 閱讀:473 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)php如何實(shí)現(xiàn)無限級(jí)分類查詢的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

遞歸函數(shù)實(shí)現(xiàn)方式

上面提到,遞歸函數(shù)的也是借助于棧的機(jī)制實(shí)現(xiàn)的,但是底層對(duì)于棧的處理對(duì)于程序員來說都是透明的,程序員只需要關(guān)心應(yīng)用的實(shí)現(xiàn)邏輯。所以說使用遞歸處理上述問題理解起來比較容易,代碼也比較簡(jiǎn)潔。

既然使用遞歸函數(shù),看名字我們就知道必須借助于自定義的函數(shù)。我先大概說一下其實(shí)現(xiàn)思路,具體細(xì)節(jié)我們反映在代碼中。

對(duì)于每一層的函數(shù)其主要做的工作就是查找父Id為當(dāng)前Id的欄目,查找到以后再次調(diào)用自身函數(shù),將查找到的欄目的id作為下一層的父id。

其流程圖如下

php如何實(shí)現(xiàn)無限級(jí)分類查詢

圖一

不知道對(duì)于上面的解釋大家能不能理解,沒關(guān)系我們下面直接看代碼

<?php
/**
 * 個(gè)人博客:跡憶博客
 * 博客地址:www.onmpw.com
 * 遞歸實(shí)現(xiàn)無限極分類
 */
$channels = array(
  array('id'=>1,'name'=>"衣服",'parId'=>0),
  array('id'=>2,'name'=>"書籍",'parId'=>0),
  array('id'=>3,'name'=>"T恤",'parId'=>1),
  array('id'=>4,'name'=>"褲子",'parId'=>1),
  array('id'=>5,'name'=>"鞋子",'parId'=>1),
  array('id'=>6,'name'=>"皮鞋",'parId'=>5),
  array('id'=>7,'name'=>"運(yùn)動(dòng)鞋",'parId'=>5),
  array('id'=>8,'name'=>"耐克",'parId'=>7),
  array('id'=>9,'name'=>"耐克",'parId'=>3),
  array('id'=>10,'name'=>"鴻星爾克",'parId'=>7),
  array('id'=>11,'name'=>"小說",'parId'=>2),
  array('id'=>12,'name'=>"科幻小說",'parId'=>11),
  array('id'=>13,'name'=>"古典名著",'parId'=>11),
  array('id'=>14,'name'=>"文學(xué)",'parId'=>2),
  array('id'=>15,'name'=>"四書五經(jīng)",'parId'=>14)
);
$html = array();
/**
 * 遞歸查找父id為$parid的結(jié)點(diǎn)
 * @param array $html  按照父-》子的結(jié)構(gòu)存放查找出來的結(jié)點(diǎn)
 * @param int $parid  指定的父id
 * @param array $channels  數(shù)據(jù)數(shù)組
 * @param int $dep  遍歷的深度,初始化為1
 */
function getChild(&$html,$parid,$channels,$dep){
  /*
   * 遍歷數(shù)據(jù),查找parId為參數(shù)$parid指定的id
   */
  for($i = 0;$i<count($channels);$i++){
    if($channels[$i]['parId'] == $parid){
      $html[] = array('id'=>$channels[$i]['id'],'name'=>$channels[$i]['name'],'dep'=>$dep);
      getChild($html,$channels[$i]['id'],$channels,$dep+1);
    }
  }
}
getChild($html,0,$channels,1);
?>

這是遞歸實(shí)現(xiàn)無限級(jí)欄目查詢的核心代碼,結(jié)合圖一對(duì)其實(shí)現(xiàn)流程應(yīng)該有一個(gè)較清晰的認(rèn)識(shí)。

非遞歸,即使用棧機(jī)制實(shí)現(xiàn)無限級(jí)欄目的查詢

在上面我們大概介紹了一下使用遞歸的方式實(shí)現(xiàn)無限級(jí)欄目的查詢,下面我們簡(jiǎn)單介紹一下非遞歸的方式。雖說不用遞歸函數(shù)的方式,但是鑒于無限級(jí)欄目的結(jié)構(gòu)頁需要參考遞歸的實(shí)現(xiàn)機(jī)制——棧的機(jī)制,解決這一問題。

在上學(xué)的時(shí)候老師就說,其實(shí)棧的核心機(jī)制也就四個(gè)字:先進(jìn)后出。

在這對(duì)于棧的機(jī)制不多說,主要說一下如何借助棧實(shí)現(xiàn)無限級(jí)欄目查詢。

1. 首先將頂級(jí)欄目壓入棧中

2. 將棧頂元素出棧

3. 將出棧元素存入數(shù)組中,標(biāo)記其深度(其深度就是在其父欄目的深度上面加1)

4. 以出棧的元素為父欄目,查找其子欄目

5. 將查找到的子欄目入棧,重復(fù)步驟2

6. 判斷棧為空的話,流程結(jié)束;

通過對(duì)以上步驟的翻譯,可以將這些步驟翻譯成PHP代碼,其核心代碼如下

<?php
/**
 * 個(gè)人博客:跡憶博客
 * 博客地址:www.onmpw.com
*使用非遞歸,即使用棧的方式實(shí)現(xiàn)欄目的無限極分類查詢
*/
$channels = array(
  array('id'=>1,'name'=>"衣服",'parId'=>0),
  array('id'=>2,'name'=>"書籍",'parId'=>0),
  array('id'=>3,'name'=>"T恤",'parId'=>1),
  array('id'=>4,'name'=>"褲子",'parId'=>1),
  array('id'=>5,'name'=>"鞋子",'parId'=>1),
  array('id'=>6,'name'=>"皮鞋",'parId'=>5),
  array('id'=>7,'name'=>"運(yùn)動(dòng)鞋",'parId'=>5),
  array('id'=>8,'name'=>"耐克",'parId'=>7),
  array('id'=>9,'name'=>"耐克",'parId'=>3),
  array('id'=>10,'name'=>"鴻星爾克",'parId'=>7),
  array('id'=>11,'name'=>"小說",'parId'=>2),
  array('id'=>12,'name'=>"科幻小說",'parId'=>11),
  array('id'=>13,'name'=>"古典名著",'parId'=>11),
  array('id'=>14,'name'=>"文學(xué)",'parId'=>2),
  array('id'=>15,'name'=>"四書五經(jīng)",'parId'=>14)
);
$stack = array(); //定義一個(gè)空棧
$html = array();  //用來保存各個(gè)欄目之間的關(guān)系以及該欄目的深度
/*
 * 自定義入棧函數(shù)
 */
function pushStack(&$stack,$channel,$dep){
  array_push($stack, array('channel'=>$channel,'dep'=>$dep));
}
/*
 * 自定義出棧函數(shù)
 */
function popStack(&$stack){
  return array_pop($stack);
}
/*
 * 首先將頂級(jí)欄目壓入棧中
 */
foreach($channels as $key=>$val){
  if($val['parId'] == 0)
    pushStack($stack,$val,0);
}
/*
 * 將棧中的元素出棧,查找其子欄目
 */
do{
  $par = popStack($stack); //將棧頂元素出棧
  /*
   * 查找以此欄目為父級(jí)欄目的id,將這些欄目入棧
   */
  for($i=0;$i<count($channels);$i++){
    if($channels[$i]['parId'] == $par['channel']['id']){
      pushStack($stack,$channels[$i],$par['dep']+1);
    }
  }
  /*
   * 將出棧的欄目以及該欄目的深度保存到數(shù)組中
   */
  $html[] = array('id'=>$par['channel']['id'],'name'=>$par['channel']['name'],'dep'=>$par['dep']);
}while(count($stack)>0);

感謝各位的閱讀!關(guān)于“php如何實(shí)現(xiàn)無限級(jí)分類查詢”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(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)容。

php
AI