无限极分类不知pid_PHP实现无限极分类
生活随笔
收集整理的這篇文章主要介紹了
无限极分类不知pid_PHP实现无限极分类
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
導(dǎo)讀:說(shuō)到無(wú)限極分類,這個(gè)在程序中是常見(jiàn)的一個(gè)功能點(diǎn)了。實(shí)現(xiàn)的方式也有很多種,今天著重分享一下涉及到數(shù)據(jù)庫(kù)的無(wú)線分類,可以使用遞歸處理,也可以使用循環(huán)查詢數(shù)據(jù)庫(kù)處理。但是我們考慮到數(shù)據(jù)庫(kù)的性能問(wèn)題,都不建議采用循環(huán)查庫(kù)。都是直接設(shè)計(jì)好數(shù)據(jù)表,直接查庫(kù),通過(guò)代碼層實(shí)現(xiàn)。
1.我們實(shí)現(xiàn)準(zhǔn)備好數(shù)據(jù)表,代碼結(jié)構(gòu)如下。
CREATE TABLE `bg_cate` ( `cate_Id` int(30) unsigned NOT NULL AUTO_INCREMENT, `cate_ParentId` int(30) unsigned DEFAULT '0', `cate_Name` varchar(100) NOT NULL, `cate_Intro` varchar(500) DEFAULT NULL, `cate_Order` int(30) unsigned DEFAULT '0', `cate_Icon` varchar(100) DEFAULT NULL, PRIMARY KEY (`cate_Id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ; INSERT INTO `bg_cate` (`cate_Id`, `cate_ParentId`, `cate_Name`, `cate_Intro`, `cate_Order`, `cate_Icon`) VALUES (4, 0, '往事如風(fēng)', '記錄往事', 0, 'icons/6.gif'), (5, 0, '水煮三國(guó)', '品位三國(guó)智慧', 0, 'icons/3.gif'), (2, 0, '技術(shù)學(xué)習(xí)', '平時(shí)學(xué)習(xí)的一些筆記,歡迎批評(píng)指正。', 0, 'icons/18.gif'), (3, 0, '生活點(diǎn)滴', '記錄生活點(diǎn)滴', 0, 'icons/2.gif'), (6, 0, '梔子花開(kāi)', '青春無(wú)限', 0, 'icons/8.gif'), (7, 0, '假日休閑', '悠閑、自在', 0, 'icons/24.gif'), (8, 2, 'html', 'html學(xué)習(xí)', 0, 'icons/1.gif'), (9, 2, 'css', 'css學(xué)習(xí)', 0, 'icons/1.gif'), (10, 2, 'php', 'php學(xué)習(xí)', 0, 'icons/18.gif'), (11, 10, 'php基礎(chǔ)知識(shí)', 'php基礎(chǔ)知識(shí)', 0, 'icons/1.gif'), (12, 10, 'oop', 'oop', 0, 'icons/1.gif'), (13, 10, 'php安全', '講述php安全', 0, 'icons/1.gif'), (14, 10, 'seagull framework', 'seagull framework', 0, 'icons/1.gif'), (15, 2, 'javascript', 'javascript學(xué)習(xí)', 0, 'icons/1.gif'), (16, 2, '設(shè)計(jì)模式', NULL, 0, 'icons/1.gif'), (17, 2, '軟件工程', '軟件工程學(xué)習(xí)', 0, 'icons/1.gif'), (18, 3, '廈門生活', '廈門生活', 0, 'icons/8.gif'), (19, 3, '大學(xué)生活', '大學(xué)生活', 0, 'icons/8.gif'), (20, 3, '童年生活', '童年生活', 0, 'icons/15.gif'), (21, 19, '學(xué)習(xí)', '學(xué)習(xí)', 0, 'icons/1.gif'), (22, 19, '運(yùn)動(dòng)', '運(yùn)動(dòng)', 0, 'icons/16.gif'), (23, 19, '旅游', '旅游', 0, 'icons/24.gif'), (24, 22, '排球', '排球', 0, 'icons/9.gif'), (25, 22, '籃球', '籃球', 0, 'icons/9.gif'), (26, 22, '羽毛球', '羽毛球', 0, 'icons/9.gif'), (27, 22, '乒乓球', '乒乓球', 0, 'icons/9.gif');2.查詢數(shù)據(jù)表數(shù)據(jù)
select * from bg_cate cate3.代碼遞歸處理數(shù)據(jù),是數(shù)據(jù)結(jié)構(gòu)呈現(xiàn)為樹(shù)狀結(jié)構(gòu)
function getTree($data, $pId) {$tree = [];foreach($data as $k => $v){if($v['cate_ParentId'] == $pId){ $v['children'] = getTree($data, $v['cate_Id']);$tree[] = $v;}}return $tree; } // 這里的0就是頂級(jí)分類中的cate_ParentId $tree = getTree($data, 0);前面屬于個(gè)人案例,下面分享一個(gè)網(wǎng)上比較簡(jiǎn)潔的遞歸算法。
<?php // 這里為了篇幅就不展現(xiàn)運(yùn)行效果,這段代碼確保是可以正常運(yùn)行的。 直接使用即可。下面分享自己使用該demo實(shí)現(xiàn)的。 function genTree5($items) { foreach ($items as $item) $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']]; return isset($items[0]['son']) ? $items[0]['son'] : array(); } /*** 將數(shù)據(jù)格式化成樹(shù)形結(jié)構(gòu)* @author Xuefen.Tong* @param array $items* @return array */ function genTree9($items) {$tree = array(); //格式化好的樹(shù)foreach ($items as $item)if (isset($items[$item['pid']]))$items[$item['pid']]['son'][] = &$items[$item['id']];else$tree[] = &$items[$item['id']];return $tree; } $items = array(1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),2 => array('id' => 2, 'pid' => 0, 'name' => '黑龍江省'),3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),4 => array('id' => 4, 'pid' => 2, 'name' => '哈爾濱市'),5 => array('id' => 5, 'pid' => 2, 'name' => '雞西市'),6 => array('id' => 6, 'pid' => 4, 'name' => '香坊區(qū)'),7 => array('id' => 7, 'pid' => 4, 'name' => '南崗區(qū)'),8 => array('id' => 8, 'pid' => 6, 'name' => '和興路'),9 => array('id' => 9, 'pid' => 7, 'name' => '西大直街'),10 => array('id' => 10, 'pid' => 8, 'name' => '東北林業(yè)大學(xué)'),11 => array('id' => 11, 'pid' => 9, 'name' => '哈爾濱工業(yè)大學(xué)'),12 => array('id' => 12, 'pid' => 8, 'name' => '哈爾濱師范大學(xué)'),13 => array('id' => 13, 'pid' => 1, 'name' => '贛州市'),14 => array('id' => 14, 'pid' => 13, 'name' => '贛縣'),15 => array('id' => 15, 'pid' => 13, 'name' => '于都縣'),16 => array('id' => 16, 'pid' => 14, 'name' => '茅店鎮(zhèn)'),17 => array('id' => 17, 'pid' => 14, 'name' => '大田鄉(xiāng)'),18 => array('id' => 18, 'pid' => 16, 'name' => '義源村'),19 => array('id' => 19, 'pid' => 16, 'name' => '上壩村'), ); echo "<pre>"; print_r(genTree5($items)); print_r(genTree9($items));function getTree($data, $pid) {$list = [];foreach($data as $key=>$val) {if($val['pid'] == $pid){$val['children'] = getTree($data, $val['id']);$list[] = $val;}}return $list; } print_r(getTree($items, 0));以上內(nèi)容希望幫助到大家,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問(wèn)題和瓶頸,業(yè)務(wù)代碼寫多了沒(méi)有方向感,不知道該從那里入手去提升,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家,需要
PHP進(jìn)階架構(gòu)師>>>視頻、面試文檔免費(fèi)獲取?shimo.im或 者關(guān)注咱們下面的知乎專欄
PHP大神進(jìn)階?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的无限极分类不知pid_PHP实现无限极分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python对象一定要删除引用吗_Pyt
- 下一篇: 展示动图_DNF:多GIF动图展示,暗夜