日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

无限极分类中递归查找一个树结构

發(fā)布時(shí)間:2025/3/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无限极分类中递归查找一个树结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題:設(shè)計(jì)公司的員工表,員工有不同級(jí)別,要求可通過一個(gè)員工查到其下屬的所有員工,也可查到其所屬的上級(jí)。

解決:遞歸實(shí)現(xiàn)無限分類思想,每一個(gè)員工存入其所屬的上級(jí)的id作為自己的pid,另外存入path,path包含自身id,方便顯示路徑。

遞歸的注意點(diǎn):

1.一定有一個(gè)判斷條件,否則遞歸就死循環(huán)了

2.每次的遞歸結(jié)果要保存起來,變量自增的實(shí)現(xiàn)三種方式:

function(&$bar):通過引用地址

global :通過設(shè)置為全局變量

static :設(shè)置為靜態(tài)變量

header( "Content-type: text/html; charset=utf-8" );$arr = array( array( 'uid'=>'1', 'name'=>'總監(jiān)張', 'pid'=>'0', 'path'=>'0,' ), array( 'uid'=>'2', 'name'=>'副總王', 'pid'=>'1', 'path'=>'0,1,' ), array( 'uid'=>'3', 'name'=>'經(jīng)理趙', 'pid'=>'2', 'path'=>'0,1,2,' ), array( 'uid'=>'4', 'name'=>'員工趙', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ), array( 'uid'=>'5', 'name'=>'員工房', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ), array( 'uid'=>'6', 'name'=>'組長劉', 'pid'=>'3', 'path'=>'0,1,2,3,' ), array( 'uid'=>'7', 'name'=>'經(jīng)理光桿', 'pid'=>'2', 'path'=>'0,1,2,' ), ); /** * 通過傳入要查找的人的pid來遞歸查找他的下屬,代碼簡陋,理解精神為主 * @param array $data 數(shù)組代替數(shù)據(jù)庫中的數(shù)據(jù) * @param integer $pid 父id * @param array &$result 結(jié)果數(shù)組,&保證變量常駐 * @param integer $deep 輸出的分隔符--,無實(shí)際意義 * @return 樹狀結(jié)構(gòu)數(shù)組 */ function getList( $data, $pid=0, &$result=array(), $deep = 0 ) { $deep+=2; foreach ( $data as $key => $val ) { if ( $pid == $val['pid'] ) { $result[] = "|".str_repeat("--", $deep).$val['name']; getList( $data, $val['uid'], $result, $deep ); } } return $result; } //調(diào)用函數(shù)輸出結(jié)果 $res = getList($arr, 1); //查找副總王的下屬 foreach($res as $key=>$val){ echo $val."\n"; }
/*
|----副總王
|--------經(jīng)理趙
|------------組長劉
|----------------員工趙
|----------------員工房
|--------經(jīng)理光桿
*/

還是上邊的數(shù)據(jù),現(xiàn)在要查一個(gè)員工的所有上級(jí)

/*** 傳入員工的id,可以查找員工所屬的上級(jí)* @param array $data 數(shù)組代替數(shù)據(jù)庫中的數(shù)據(jù)* @param integer $id 要查找的員工的id* @param array &$result 結(jié)果數(shù)組,&保證變量常駐* @return 結(jié)果*/ function getLink($data, $id=0, &$result=array()){ foreach ($data as $key => $val) { if ($val['uid'] == $id) { $result[] = $val['name']; getLink($data, $val['pid'], $result); } } return $result; } $res = getLink($arr , 5); //查找員工房的上級(jí) foreach ($res as $key => $val) { echo $val." | "; } /* 員工房 | 組長劉 | 經(jīng)理趙 | 副總王 | 總監(jiān)張 | */

注:也可用全路徑無限分類:數(shù)據(jù)中存了path,全路徑可通過concat(path,",",id)算出來。
優(yōu)點(diǎn):查詢快,比遞歸快
缺點(diǎn):增加,移動(dòng)分類時(shí)稍顯復(fù)雜

轉(zhuǎn)載于:https://www.cnblogs.com/KTblog/p/9025120.html

總結(jié)

以上是生活随笔為你收集整理的无限极分类中递归查找一个树结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。