zoukankan      html  css  js  c++  java
  • 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日

  • 相关阅读:
    数据结构----------堆栈
    数据结构----------双向链表
    剑指offer32----之字形打印一颗二叉树
    剑指offer31----栈的压入、弹出序列
    MySQL----日期处理函数
    1.1 文档PUT内部原理
    1 集群状态、增删改查、全量替换、强制创建、设置单个index的分片数副本数
    编译问题:'<invalid-global-code>' does not contain a definition for 'Store' and no extension method 'XXX' accepting a first argument of type '<invalid-global-code>' could be found
    ES timeout 的一些笔记
    elasticsearch 5.0以上不支持consistency 和 quorum
  • 原文地址:https://www.cnblogs.com/YFYQ/p/10681698.html
Copyright © 2011-2022 走看看