php實現無限級分類查詢(遞迴、非遞迴),分類查詢遞迴_PHP教程

來源:互聯網
上載者:User

php實現無限級分類查詢(遞迴、非遞迴),分類查詢遞迴


做PHP這麼長時間,發現後台管理系統不可少的一個應用模組就是對欄目的分類,一般情況下欄目都要做成是無限級的,也就是說每個欄目理論上都可以添加子欄目。在我看來這種情況處理起來整體上說也不是很複雜,唯一一個相對來說較難的點是無限級欄目的查詢。

下面就這種情況我來向大家做一個簡單的介紹,對於這種無限級欄目的查詢一般情況下有兩種方式,其中一種就是使用棧的機制,另一種是使用遞迴函式的方式(當然遞迴函式實現機制也是藉助於棧來實現的)。就這兩種方式下面我們分別介紹。

遞迴函式實現方式

上面提到,遞迴函式的也是藉助於棧的機制實現的,但是底層對於棧的處理對於程式員來說都是透明的,程式員只需要關心應用的實現邏輯。所以說使用遞迴處理上述問題理解起來比較容易,代碼也比較簡潔。

既然使用遞迴函式,看名字我們就知道必須藉助於自訂的函數。我先大概說一下其實現思路,具體細節我們反映在代碼中。

對於每一層的函數其主要做的工作就是尋找父Id為當前Id的欄目,尋找到以後再次調用自身函數,將尋找到的欄目的id作為下一層的父id。

其流程圖如下

圖一

不知道對於上面的解釋大家能不能理解,沒關係我們下面直接看代碼

<?php/** * 個人部落格:跡憶部落格 * 部落格地址:www.onmpw.com * 遞迴實現無限極分類 */$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'=>"運動鞋",'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'=>"文學",'parId'=>2),  array('id'=>15,'name'=>"四書五經",'parId'=>14));$html = array();/** * 遞迴尋找父id為$parid的結點 * @param array $html  按照父-》子的結構存放尋找出來的結點 * @param int $parid  指定的父id * @param array $channels  資料數組 * @param int $dep  遍曆的深度,初始化為1 */function getChild(&$html,$parid,$channels,$dep){  /*   * 遍曆資料,尋找parId為參數$parid指定的id   */  for($i = 0;$i$channels[$i]['id'],'name'=>$channels[$i]['name'],'dep'=>$dep);      getChild($html,$channels[$i]['id'],$channels,$dep+1);    }  }}getChild($html,0,$channels,1);?>

這是遞迴實現無限級欄目查詢的核心代碼,結合圖一對其實現流程應該有一個較清晰的認識。

非遞迴,即使用棧機制實現無限級欄目的查詢

在上面我們大概介紹了一下使用遞迴的方式實現無限級欄目的查詢,下面我們簡單介紹一下非遞迴的方式。雖說不用遞迴函式的方式,但是鑒於無限級欄目的結構頁需要參考遞迴的實現機制——棧的機制,解決這一問題。

在上學的時候老師就說,其實棧的核心機制也就四個字:先進後出。

在這對於棧的機制不多說,主要說一下如何藉助棧實現無限級欄目查詢。

1. 首先將頂級欄目壓入棧中

2. 將棧頂元素出棧

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

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

5. 將尋找到的子欄目入棧,重複步驟2

6. 判斷棧為空白的話,流程結束;

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

<?php/** * 個人部落格:跡憶部落格 * 部落格地址:www.onmpw.com*使用非遞迴,即使用棧的方式實現欄目的無限極分類查詢*/$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'=>"運動鞋",'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'=>"文學",'parId'=>2),  array('id'=>15,'name'=>"四書五經",'parId'=>14));$stack = array(); //定義一個空棧$html = array();  //用來儲存各個欄目之間的關係以及該欄目的深度/* * 自訂入棧函數 */function pushStack(&$stack,$channel,$dep){  array_push($stack, array('channel'=>$channel,'dep'=>$dep));}/* * 自訂出棧函數 */function popStack(&$stack){  return array_pop($stack);}/* * 首先將頂級欄目壓入棧中 */foreach($channels as $key=>$val){  if($val['parId'] == 0)    pushStack($stack,$val,0);}/* * 將棧中的元素出棧,尋找其子欄目 */do{  $par = popStack($stack); //將棧頂元素出棧  /*   * 尋找以此欄目為父級欄目的id,將這些欄目入棧   */  for($i=0;$i$par['channel']['id'],'name'=>$par['channel']['name'],'dep'=>$par['dep']);}while(count($stack)>0);

上面就是使用非遞迴方式實現的。

下載代碼:https://github.com/onmpw/phpApp

總結

上面兩種方式各有利弊,雖然實現形式上面不同,但是鑒於無限級欄目的結構,二者實現的機制都是相同的——都藉助棧的方式來實現。在現實情況中,我們要根據現實情況的需要選擇一種方式來實現。

您可能感興趣的文章:

  • php+mysql實現無限級分類 | 樹型顯示分類別關係
  • php 無限級分類學習參考之對ecshop無限級分類的解析 帶詳細注釋
  • php實現無限級分類實現代碼(遞迴方法)
  • 表格展示無限級分類(PHP版)
  • php 無限級分類,超級簡單的無限級分類,支援輸出樹狀圖
  • ThinkPHP自動填滿實現無限級分類的方法
  • ThinkPHP無限級分類原理實現留言與回複功能執行個體
  • php實現無限級分類
  • PHP實現無限級分類(不使用遞迴)
  • 2款PHP無限級分類執行個體代碼

http://www.bkjia.com/PHPjc/1108609.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1108609.htmlTechArticlephp實現無限級分類查詢(遞迴、非遞迴),分類查詢遞迴 做PHP這麼長時間,發現後台管理系統不可少的一個應用模組就是對欄目的分類,一...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.