PHP無限極分類

最近工作中用到了關于無限極分類的功能,于是查詢了一下相關內容晴竞。
無限極分類有兩種實現方式
     - 毗鄰目錄模式
     - 預排序遍歷樹算法
要了解這兩種方式具體內容洞焙,可以去查看這篇博客: 左右值無限分類實現算法
本文主要提供兩種將符合無限極分類格式的二維數組轉化為樹狀形式數組方法吕朵。
  • 毗鄰目錄模式
function getNodeTree(&$list,&$tree,$pid=0){
    foreach($list as $key=>$value){
        if($pid == $value['parent']){
            $tree[$value['id']]=$value;
            unset($list[$key]);
            getNodeTree($list,$tree[$value['id']]['children'],$value['id']);
        }
    }
}

其中第一個參數為需要處理的數組绰垂,$tree即為最后所需結果嗅榕。

  • 預排序遍歷樹算法
    上面的文章中對于預排序遍歷樹算法的描述我覺得不夠生動顺饮,所以在下面重新畫了一幅圖用來描述這種結構。
    image.png

    我們將一個折看成一個節(jié)點凌那,其中1-14為父節(jié)點兼雄,2-7、8-9帽蝶、10-11赦肋、12-13為1-14的子節(jié)點,3-6為2-7的子節(jié)點嘲碱,4-5為3-6的子節(jié)點金砍,折左邊的豎線代表的位置就是該節(jié)點的左值,右邊的豎線代表的位置就是該節(jié)點的右值麦锯。這樣也比較好理解為何增加一個節(jié)點恕稠,有些值需要加2。同樣比較容易理解為何按左值排序得到的數組就是最終樹的順序扶欣。同樣可以解釋鹅巍,為什么查詢左值大于某個節(jié)點左值同時右值小于該節(jié)點右值的節(jié)點就是該節(jié)點的所有子節(jié)點
    image.png

    從圖中可以看到料祠,將節(jié)點按左值增加順序排序骆捧,大于增加位置上一個節(jié)點右值的所有左右值都需加2。同理可以比較好理解減去一個節(jié)點和移動一個子樹后左右值的變化髓绽。

以下是將符合預排序遍歷樹算法的二維數組轉化為樹形結構數組的方法敛苇。

function getNodeTree($arr,&$tree,$last_level=-1)
{
  static $used_key = [];
  foreach ($arr as $key => $value) {
    if ( in_array($key,$used_key) ) {
      continue;
    }
    $current_level = $value['level'];
    $next_level = isset($arr[$key+1])?$arr[$key+1]['level']:-1;
    if ( $current_level >= $last_level ) {
      $tree[]=$value;
      end($tree);
      $index = key($tree);
      $used_key[] = $key;
      unset($arr[$key]);
      $last_level = $value['level'];
      if ( $next_level > $current_level ) {
        getNodeTree($arr,$tree[$index]['children'],$last_level);
      }
      if ( $next_level == $current_level ) {
        getNodeTree($arr,$tree,$last_level);
      }
    }else{
      break;
    }
  }
}

其中第一個參數為需要處理的數組,數組要求必須按左值增加順序排序顺呕,$tree為最后所需結果枫攀。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末括饶,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子来涨,更是在濱河造成了極大的恐慌图焰,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦掐,死亡現場離奇詭異技羔,居然都是意外死亡,警方通過查閱死者的電腦和手機卧抗,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門藤滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颗味,你說我怎么就攤上這事超陆∥” “怎么了浦马?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長张漂。 經常有香客問我晶默,道長,這世上最難降的妖魔是什么航攒? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任磺陡,我火速辦了婚禮,結果婚禮上漠畜,老公的妹妹穿的比我還像新娘币他。我一直安慰自己,他們只是感情好憔狞,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布蝴悉。 她就那樣靜靜地躺著,像睡著了一般瘾敢。 火紅的嫁衣襯著肌膚如雪拍冠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天簇抵,我揣著相機與錄音庆杜,去河邊找鬼。 笑死碟摆,一個胖子當著我的面吹牛晃财,可吹牛的內容都是我干的。 我是一名探鬼主播典蜕,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼断盛,長吁一口氣:“原來是場噩夢啊……” “哼雏逾!你這毒婦竟也來了?” 一聲冷哼從身側響起郑临,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤栖博,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厢洞,有當地人在樹林里發(fā)現了一具尸體仇让,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年躺翻,在試婚紗的時候發(fā)現自己被綠了丧叽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡公你,死狀恐怖踊淳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情陕靠,我是刑警寧澤迂尝,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站剪芥,受9級特大地震影響垄开,放射性物質發(fā)生泄漏。R本人自食惡果不足惜税肪,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一溉躲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧益兄,春花似錦锻梳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灸叼,卻和暖如春神汹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古今。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工屁魏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉腥。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓氓拼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桃漾,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • 1 序 2016年6月25日夜坏匪,帝都,天下著大雨撬统,拖著行李箱和同學在校門口照了最后一張合照适滓,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,076評論 0 12
  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表恋追,棧凭迹,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,435評論 1 31
  • 什么是無限分類苦囱? 無限分類就是一個分類下面可以創(chuàng)建多個子類嗅绸,而其子類下面亦可以創(chuàng)建不同子類,如此往復撕彤,沒有終點鱼鸠; ...
    PHPer_閱讀 1,589評論 0 3
  • 概述 ??在實際工作中,經常要用到無限極分類羹铅。如導航表等等蚀狰。到網上一搜php無限極分類,很多睦裳,但好多都是一個造锅,并且...
    林灣村龍貓閱讀 5,050評論 4 12
  • 3月16日~胡芳~作業(yè)~你的領導力在哪一階層?我似乎感覺和氣場兩個字可以聯系廉邑!一個有領導力的人她的氣場就是不一般。...
    胡芳葉夢之藍閱讀 242評論 0 0