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日