PHP 遞歸無限極下級


下面是自己用到的一些遞歸方法,當然都是借鑒的,各位看官請勿怪

第一種 有層級

$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日

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM