下面是自己用到的一些递归方法,当然都是借鉴的,各位看官请勿怪
第一种 有层级
$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
再次感谢。
本文只是博主自己存储用到的一些方法,如果对您有所帮助,是对博主最大的满足
再次感谢两位大大的分享
2019年04月10日