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 ...
随机推荐
- Qt中csv文件的导入与导出
转自:http://blog.csdn.net/mingxia_sui/article/details/7683030 CSV 1.简介: 全称:Comma Separated Values. 是“逗 ...
- lightoj 1125【背包·从n个选m个】
题意: 给你 n 个背包,然后给你两个数,D,M,问你从n个里面挑M个出来,有多少种方法能够整除D: 思路: 试想我先不挑M个出来的话,仅仅是构造一个D的倍数,其实就是构造一个数的话, 其实就是个递推 ...
- Codeforces712B【= =】
题意: 题意: 最少需要几步改变能够使得按照原序列的走法从起源走到起源: 思路: 长度奇数肯定不行 偶数的情况下.. 其实题意转变就是有4个数a,b,c,d,在最小的改变下,使a==b,c==d; 那 ...
- laravel M层
目录 App\Models 没有就自己创一个 创建对应控制器的php文件,首字母大写 <?php namespace App\Models; use Illuminate\Database\ ...
- Unity5.0 EventSystem事件系统的详细说明
http://www.manew.com/blog-56596-2917.html?_dsign=53b25d5d unity5.0开发了新的UI系统UGUI,附带的事件系统EventSystem不仅 ...
- PJzhang: github与出口管制·说明条款
猫宁!!! 参考链接:https://www.infoq.cn/article/KMl2EO*PSMxIkVREiYvC https://help.github.com/en/articles/git ...
- Poj2299 Ultra-QuickSort(另附本质不同逆序对)
Description 给定一个长度为 n(n≤5*10^5) 的序列 a,如果只允许进行比较和交换相邻两个数的操作求至少需要多少次交换才能把 a 从小到大排序. Input The input co ...
- 用css固定textarea文本域大小尺寸
textarea元素在chrome等浏览器下可以被拖拉从而改变大小,对于查看textarea里面的内容来说相当方便,但是有时候 我们为了保持网页的美观,不得不想要禁掉这个功能,禁止用户随意拉动text ...
- 使用jqzoom插件时
[javascript] view plaincopy /*使用jqzoom*/ $(function() { $(".jqzoom").jqueryzoom({ xzoom: 3 ...
- [题解]luogu_P2613有理数取余
#include<bits/stdc++.h> #define ll long long using namespace std; ; inline int read(){ ,fix=;c ...