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日
PHP 递归无限极下级的更多相关文章
- Think PHP递归重新排序无限极子分类数组(递归无限极分类)
Think PHP递归重新排序无限极子分类数组 // 递归重新排序无限极子分类数组 function recursive($array,$pid=0,$level=0){ $arr = array() ...
- php递归无限极分类实例
无限级分类原理简介 无限分类看似"高大上",实际上原理是非常简单的 .无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性.要满足无限级分类,数据库需要有两个必须的字段,id ...
- php递归无限极分类
递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'p ...
- WPF—TreeView无限极绑定集合形成树结构
1.如图所示:绑定树效果图 2.前台Xaml代码: <Window x:Class="WpfTest.MainWindow" xmlns="http://schem ...
- [No0000D1]WPF—TreeView无限极绑定集合形成树结构
1.如图所示:绑定树效果图 2.前台Xaml代码: <Window x:Class="WpfTest.MainWindow" xmlns="http://schem ...
- php无限极分类递归与普通
1. 递归 public function getInfo(){$data=$this->select();$arr=$this->noLimit($data,$f_id=0,$level ...
- php不使用递归实现无限极分类
无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...
- PHP实现无限极分类的两种方式,递归和引用
面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' =& ...
- php无限极分类以及递归(thinkphp)
php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...
随机推荐
- SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表
一.水平分割 1.水平分库 1).概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中. 2).结果 每个库的结构都一样:数据都不一样: 所有库的并集是全量数据: 2.水平分表 1).概 ...
- PUSH 和 远程推送
1. UIApplacation向 APNS 注册 push notification 服务 (1) 应用程序要支持推送服务, 在网页里面配置 http://developer.apple.com/ ...
- day01 包 权限修饰符 static final
- IOS蓝牙连接 初步简单封装使用
最近写一个蓝牙项目 初步实现一下蓝牙设备连接交互,后期继续完善.... 1.连接蓝牙相关操作 BlueToothManger.h // // BlueToothManger.h // SmartRob ...
- [题解](树的计数)luogu_P4430猴子打架_/_luogu_P4981父子
来源:题解 比较不错的博客:http://www.cnblogs.com/dirge/p/5503289.html 最后生成一颗无根树,有n^(n-2)种情况,打架的顺序有(n-1)!种 #inclu ...
- jmeter diff测试(调用JAR包处理)
1.准备接口数据(对比字段,即json数据中需要提取的key对应的值进行对比) 2.配置获取EXCEL数据 3.新建线程,并建两个http请求,分别用于请求新旧接口 4.提取需要对比的内容 5.赋值变 ...
- 接口测试02 - 无法绕过的json解析
概述: 先瞧一下什么是json.JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式. 它基于ECMAScript(w3c定制的js规范)的一个子集 ...
- POJ 1458 Common Subsequence DP
http://poj.org/problem?id=1458 用dp[i][j]表示处理到第1个字符的第i个,第二个字符的第j个时的最长LCS. 1.如果str[i] == sub[j],那么LCS长 ...
- 一些API
/** * Goto the specified frame index, and pause at this index. * @param startIndex The animation wil ...
- Android -Cannot run program "XXX/sdk/tools/emulator": error=2, No such file or directory
I have installed android SDK and eclipse successfully on ubuntu 14.04. However,now it's not running. ...