下面是自己用到的一些遞歸方法,當然都是借鑒的,各位看官請勿怪
第一種 有層級
$array = array( array('id' => 1, 'pid' => 0, 'n' => '河北省'), array('id' => 2, 'pid' => 0, 'n' => '北京市'), array('id' => 3, 'pid' => 1, 'n' => '邯鄲市'), array('id' => 4, 'pid' => 2, 'n' => '朝陽區'), array('id' => 5, 'pid' => 2, 'n' => '通州區'), array('id' => 6, 'pid' => 4, 'n' => '望京'), array('id' => 7, 'pid' => 4, 'n' => '酒仙橋'), array('id' => 8, 'pid' => 3, 'n' => '永年區'), array('id' => 9, 'pid' => 1, 'n' => '武安市'), array('id' => 10, 'pid' => 8, 'n' => '永年區鎮'), array('id' => 11, 'pid' => 0, 'n' => '上海市') ); /** 遞歸獲取無限極 -- 有層級 * @parem $array 數組 * @parem $pid ,最高級別,默認為0,輸出從pid 級別的數據 * @parem $level 層級,默認0 * */ 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; } // 調用 $list=getTree($array); /**根據指定id 的查詢,所有的父級 * @parem $id_pid 要查詢的id 或者 要查詢id的pid;如果傳入的是id 包括當前id 值,如果傳入id_pid不包括當前id的值 * @parem $array 查分類的數據,在項目使用中此參數可以不傳,直接使用sql 查詢 * @parem $level 當前id所在層級,默認2 * */ function getParent($id_pid,$array=array(), $level = 2) { $f_name=__FUNCTION__; // 定義當前函數名 static $list=array(); //$array=Db::table('table_name')->where('id',$id_pid)->select(); TP5 foreach($array as $k=>$v) { if($v['id']== $id_pid) { //父級分類id等於所查找的id $v['level'] = $level; //把數組放到list中 $list[] = $v; unset($array[$k]); if($v['pid']>=0) { getParent($v['pid'],$array,$level-1); } } } return $list; } // 調用 $lists = getParent(10,$array, $level = 5);
此方法借鑒於 雪劍無影 大大博客。
地址:https://www.cnblogs.com/xuey/p/8629487.html
再次感謝
第二種遞歸方法--無層級
//1.整個會員表的數據 $member = array( array('id'=>1, 'agentid'=>0, 'nickname' => 'A'), array('id'=>2, 'agentid'=>1, 'nickname' => 'B'), array('id'=>3, 'agentid'=>1, 'nickname' => 'C'), array('id'=>4, 'agentid'=>8, 'nickname' => 'D'), array('id'=>5, 'agentid'=>3, 'nickname' => 'E'), array('id'=>6, 'agentid'=>3, 'nickname' => 'F'), array('id'=>7, 'agentid'=>3, 'nickname' => 'G'), array('id'=>8, 'agentid'=>8, 'nickname' => 'H') ); /* *2.獲取某個會員的無限下級方法 *$members是所有會員數據表,$mid是用戶的id */ function GetTeamMember($members, $mid) { $Teams=array();//最終結果 $mids=array($mid);//第一次執行時候的用戶id do { $othermids=array(); $state=false; foreach ($mids as $valueone) { foreach ($members as $key => $valuetwo) { if($valuetwo['agentid']==$valueone){ $Teams[]=$valuetwo[id];//找到我的下級立即添加到最終結果中 $othermids[]=$valuetwo['id'];//將我的下級id保存起來用來下輪循環他的下級 array_splice($members,$key,1);//從所有會員中刪除他 $state=true; } } } $mids=$othermids;//foreach中找到的我的下級集合,用來下次循環 } while ($state==true); return $Teams; } $res=GetTeamMember($member ,1);
該方法借鑒自 高久峰 大大的博客。
地址鏈接:https://www.gaojiufeng.cn/?id=128
遞歸層級自定下級
* 分類遞歸 * $categorys 數值 $pId父類id $l 等級 */ function getParents($categorys,$pId = 0,$l=0){ $list =array(); foreach ($categorys as $k=>$v){ if ($v['parentid'] == $pId){ unset($categorys[$k]); if ($l < 2){ //小於三級 $v['children'] = $this->getParents($categorys,$v['id'],$l+1); } $list[] = $v; } } return $list; }
該方法借鑒自 公子肆 大大的博客。
地址鏈接:https://blog.csdn.net/qq_38805301/article/details/83415767
再次感謝。
本文只是博主自己存儲用到的一些方法,如果對您有所幫助,是對博主最大的滿足
再次感謝兩位大大的分享
2019年04月10日