亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP實現無限極分類的兩種方式示例【遞歸和引用方式】

2024-05-05 00:07:57
字體:
來源:轉載
供稿:網友

本文實例講述了PHP實現無限極分類的兩種方式。分享給大家供大家參考,具體如下:
面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加一個PID字段用來區別自己所屬的分類

$array = array(array('id' => 1, 'pid' => 0, 'name' => '河北省'),array('id' => 2, 'pid' => 0, 'name' => '北京市'),array('id' => 3, 'pid' => 1, 'name' => '邯鄲市'),array('id' => 4, 'pid' => 2, 'name' => '朝陽區'),array('id' => 5, 'pid' => 2, 'name' => '通州區'),array('id' => 6, 'pid' => 4, 'name' => '望京'),array('id' => 7, 'pid' => 4, 'name' => '酒仙橋'),array('id' => 8, 'pid' => 3, 'name' => '永年區'),array('id' => 9, 'pid' => 1, 'name' => '武安市'),);

數據在數據庫中存儲大概是這個樣子,怎么實現無限極遞歸呢,有兩種常用的做法,遞歸和引用算法

遞歸算法

/*** 遞歸實現無限極分類* @param $array 分類數據* @param $pid 父ID* @param $level 分類級別* @return $list 分好類的數組 直接遍歷即可 $level可以用來遍歷縮進*/function getTree($array, $pid =0, $level = 0){    //聲明靜態數組,避免遞歸調用時,多次聲明導致數組覆蓋    static $list = [];    foreach ($array as $key => $value){      //第一次遍歷,找到父節點為根節點的節點 也就是pid=0的節點      if ($value['pid'] == $pid){        //父節點為根節點的節點,級別為0,也就是第一級        $value['level'] = $level;        //把數組放到list中        $list[] = $value;        //把這個節點從數組中移除,減少后續遞歸消耗        unset($array[$key]);        //開始遞歸,查找父ID為該節點ID的節點,級別則為原級別+1        getTree($array, $value['id'], $level+1);      }    }    return $list;}/** 獲得遞歸完的數據,遍歷生成分類*/$array = getTree($array);foreach($array) as $value{    echo str_repeat('--', $value['level']), $value['name'].'<br />';}

輸出結果 無限極分類實現ok

河北省
--邯鄲市
----永年區
--武安市
北京市
--朝陽區
----望京
----酒仙橋
--通州區

引用算法

function generateTree($array){  //第一步 構造數據  $items = array();  foreach($array as $value){    $items[$value['id']] = $value;  }  //第二部 遍歷數據 生成樹狀結構  $tree = array();  foreach($items as $key => $value){    if(isset($items[$item['pid']])){      $items[$item['pid']]['son'][] = &$items[$key];    }else{      $tree[] = &$items[$key];    }  }  return $tree;}//經過第一步 數據變成了這樣Array(  [1] => Array    (      [id] => 1      [pid] => 0      [name] => 河北省      [children] => Array        (        )    )  [2] => Array    (      [id] => 2      [pid] => 0      [name] => 北京市      [children] => Array        (        )    )  [3] => Array    (      [id] => 3      [pid] => 1      [name] => 邯鄲市      [children] => Array        (        )    )  [4] => Array    (      [id] => 4      [pid] => 2      [name] => 朝陽區      [children] => Array        (        )    )  [5] => Array    (      [id] => 5      [pid] => 2      [name] => 通州區      [children] => Array        (        )    )  [6] => Array    (      [id] => 6      [pid] => 4      [name] => 望京      [children] => Array        (        )    )  [7] => Array    (      [id] => 7      [pid] => 4      [name] => 酒仙橋      [children] => Array        (        )    )  [8] => Array    (      [id] => 8      [pid] => 3      [name] => 永年區      [children] => Array        (        )    )  [9] => Array    (      [id] => 9      [pid] => 1      [name] => 武安市      [children] => Array        (        )    ))//第一步很容易就能看懂,就是構造數據,現在咱們仔細說一下第二步 $tree = array(); //遍歷構造的數據  foreach($items as $key => $value){  //如果pid這個節點存在    if(isset($items[$value['pid']])){      //把當前的$value放到pid節點的son中 注意 這里傳遞的是引用 為什么呢?      $items[$value['pid']]['son'][] = &$items[$key];    }else{      $tree[] = &$items[$key];    }  }//這個方法的核心在于引用,php變量默認的傳值方式是按指傳遞//也就是說 假如說 遍歷順序是 河北省 邯鄲市 當遍歷到河北省時 會把河北省放到tree中 遍歷到邯鄲市時 會把邯鄲市放到河北省的子節點數組中 但是?。。?這會兒的tree數組中 河北省已經放進去了 根據php變量按值傳遞的規則 你并沒有更改tree數組中的河北省的數據 所以這里用到了引用傳遞//當你對河北省做更改時,tree數組中的河北省也一并做了更改 下面我們做個實驗 我們把引用傳遞去掉,看一下結果//使用普通傳值輸出結果 Array(  [0] => Array    (      [id] => 1      [pid] => 0      [name] => 河北省    )  [1] => Array    (      [id] => 2      [pid] => 0      [name] => 北京市    ))//可以看到 只有河北省和北京市輸出出來了 因為他們倆是第一級節點 而且排行1和2,放到$tree數組中之后,沒有使用引用傳遞,那么后續對他倆的子節點的操作都沒有在$tree中生效,現在我們更改一下順序 把邯鄲市放到河北省的前面 那么根據咱們的推斷 那么邯鄲市就應該出現在tree數組里//邯鄲市放到河北省前面的輸出結果Array(  [0] => Array    (      [id] => 1      [pid] => 0      [name] => 河北省      [son] => Array        (          [0] => Array            (              [id] => 3              [pid] => 1              [name] => 邯鄲市            )        )    )  [1] => Array    (      [id] => 2      [pid] => 0      [name] => 北京市    ))//果然是這樣 那么證明我們的推斷是正確的 現在我們把引用傳值改回去 再看一下//使用引用傳值輸出結果Array(  [1] => Array    (      [id] => 1      [pid] => 0      [name] => 河北省      [children] => Array        (          [0] => Array            (              [id] => 3              [pid] => 1              [name] => 邯鄲市              [children] => Array                (                  [0] => Array                    (                      [id] => 8                      [pid] => 3                      [name] => 永年區                    )                )            )          [1] => Array            (              [id] => 9              [pid] => 1              [name] => 武安市            )        )    )  [2] => Array    (      [id] => 2      [pid] => 0      [name] => 北京市      [children] => Array        (          [0] => Array            (              [id] => 4              [pid] => 2              [name] => 朝陽區              [children] => Array                (                  [0] => Array                    (                      [id] => 6                      [pid] => 4                      [name] => 望京                    )                  [1] => Array                    (                      [id] => 7                      [pid] => 4                      [name] => 酒仙橋                    )                )            )          [1] => Array            (              [id] => 5              [pid] => 2              [name] => 通州區            )        )    ))//樹狀結構完美的輸出出來了 這個方法的核心就是引用傳值

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲夜色av98在线观看| 亚洲精品日韩欧美| 久久亚洲精品中文字幕冲田杏梨| 成人免费激情视频| 91欧美精品成人综合在线观看| 亚洲加勒比久久88色综合| 日韩在线视频导航| 最近2019中文字幕mv免费看| 久热精品视频在线观看一区| 久久精品影视伊人网| 欧美精品在线免费播放| 91在线播放国产| 久久人人爽国产| 日韩欧美一区视频| 成人中文字幕+乱码+中文字幕| 亚洲男人天堂网| 国产精品十八以下禁看| 国产91精品不卡视频| 亚洲欧美一区二区激情| 久久精品99久久久久久久久| 九九热精品视频国产| 欧美多人乱p欧美4p久久| 国产在线一区二区三区| 欧美精品精品精品精品免费| 日韩精品www| 国产精品精品久久久| 日韩视频免费看| 亚洲欧美精品中文字幕在线| 久久久99久久精品女同性| 国产欧美日韩精品专区| 18性欧美xxxⅹ性满足| 欧美大胆a视频| 精品久久久久久久久久| 欧美丰满老妇厨房牲生活| 久久免费少妇高潮久久精品99| 国产亚洲一区精品| 96精品久久久久中文字幕| 久久精品影视伊人网| 人人澡人人澡人人看欧美| 亚洲va久久久噜噜噜| 国产99在线|中文| 国产精品18久久久久久首页狼| 国产又爽又黄的激情精品视频| 欧美亚洲成人免费| 亚洲色图校园春色| 国产成人精品视| 亚洲欧美激情精品一区二区| 久久伊人91精品综合网站| 亚洲欧美一区二区精品久久久| 亚洲国产精品va在线看黑人动漫| 久久久91精品| 欧美精品videofree1080p| xxxxxxxxx欧美| 国产成人在线一区| 国产欧美日韩中文字幕在线| 欧美福利小视频| 色婷婷av一区二区三区在线观看| 国产最新精品视频| 亚洲精品网站在线播放gif| 神马久久桃色视频| 国产精品国产亚洲伊人久久| 在线日韩精品视频| 97色在线视频| 亚洲成人av在线播放| 久久久久久香蕉网| 国产精品九九九| 欧美成人h版在线观看| 日本高清视频一区| 欧美日韩精品二区| 久久亚洲私人国产精品va| www.亚洲人.com| 中文字幕免费国产精品| 欧美国产一区二区三区| 亚洲a级在线播放观看| 久久久久久久久久久免费| 欧美视频在线观看免费网址| 欧美综合激情网| 久久久国产影院| 久久精品一偷一偷国产| 伊人青青综合网站| 久久精品视频亚洲| 91精品国产自产在线老师啪| 亚洲日韩欧美视频| 98精品国产高清在线xxxx天堂| 亚洲精品美女免费| 国产精品久久久久久久久久三级| 日韩精品免费一线在线观看| 亚洲综合自拍一区| 中文字幕欧美视频在线| 亚洲图片欧洲图片av| 亚洲在线视频福利| 91av在线网站| 在线电影av不卡网址| 欧美亚洲国产视频| 久久中文久久字幕| 亚洲精品久久久久久下一站| 久久中文字幕在线视频| 亚洲国产一区二区三区在线观看| 欧美成人精品h版在线观看| 亚洲激情在线观看视频免费| 日韩电影中文字幕在线| 一区二区三区视频免费| 精品无人国产偷自产在线| 伊人伊成久久人综合网小说| 久久精品国产99国产精品澳门| 国产精品视频地址| 66m—66摸成人免费视频| 亚洲经典中文字幕| 日韩福利在线播放| 日韩激情片免费| 国产精品久久久久久久久久久不卡| 国内精品小视频| 日韩在线观看免费全集电视剧网站| 亚洲欧美日韩成人| 亚洲免费电影一区| 亚洲天堂成人在线| 77777少妇光屁股久久一区| 亚洲人成人99网站| 成人免费xxxxx在线观看| 亚洲视屏在线播放| 欧美激情综合亚洲一二区| 亚洲日本中文字幕| 久久国产精品免费视频| 亚洲在线观看视频网站| 成人黄色生活片| 日韩在线中文字| 欧美亚洲免费电影| 欧美性视频在线| 欧美性一区二区三区| 九九热这里只有精品免费看| 最近2019中文字幕第三页视频| 理论片在线不卡免费观看| 国产有码在线一区二区视频| 精品久久久久久中文字幕| 亚洲精品小视频在线观看| 亚洲男人天堂2019| 亚洲iv一区二区三区| yw.139尤物在线精品视频| 久久久久久香蕉网| 国产婷婷色综合av蜜臀av| 欧美日产国产成人免费图片| 精品成人久久av| 91网站在线看| 日本中文字幕不卡免费| 亚洲男人的天堂在线| www亚洲精品| 色yeye香蕉凹凸一区二区av| 国产91免费观看| 久久久久久久久久久91| 久久影视电视剧免费网站| 国产精品福利无圣光在线一区| 精品美女永久免费视频| 国产69精品久久久| 欧美天天综合色影久久精品| 亚洲第一综合天堂另类专| 久久视频在线观看免费| 国产999精品久久久| 国产精品福利在线观看| 亚洲欧美日韩视频一区| 欧美激情视频在线免费观看 欧美视频免费一| 日韩精品在线观看一区二区| 在线亚洲欧美视频| 欧美成人精品xxx| 日韩在线观看免费|