PHP实现无限级分类

本文介绍了一种无限级分类处理的方法,包括寻找指定栏目的子栏目、子孙栏目及家谱树等操作。通过具体实例展示了如何利用PHP编程实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	$arr=array(
	array('id'=>'1','name'=>'北京','parent'=>'0'),
	array('id'=>'2','name'=>'上海','parent'=>'0'),
	array('id'=>'3','name'=>'浦东','parent'=>'2'),
	array('id'=>'4','name'=>'朝阳','parent'=>'1'),
	array('id'=>'5','name'=>'广州','parent'=>'0'),
	array('id'=>'6','name'=>'三里屯','parent'=>'4'),
	array('id'=>'7','name'=>'广东','parent'=>'5'),
	array('id'=>'8','name'=>'三里','parent'=>'4')
);




无限级分类,牵涉2个应用0是 找指定栏目的子栏目1是 找指定栏目的子孙栏目,即子孙树

2是 找指定的栏目的父栏目/父栏目....顶级栏目  家谱树

2是 找指定的栏目的父栏目/父栏目....顶级栏目

//找子栏目
	function findson($arr,$id=0){
		//$id栏目的儿子有哪些呢?
		//答数组循环一遍,谁的parent值等于$id,谁就是它儿子
		$sons=array(); //子栏目数组
		foreach($arr as $v){
			if($v['parent']==$id){
				$sons[]=$v;
			}
		}
	 return $sons;
	}

	print_r(findson($arr,0));

	//找子孙树
	//用静态变量
	
	function subtree($arr,$id=0,$lev=1){
		//$id栏目的儿子有哪些呢?
		//答数组循环一遍,谁的parent值等于$id,谁就是它儿子
		static $subs=array(); //子栏目数组
		foreach($arr as $v){
				//我想子孙数的话,就要把儿子的$id,传过来,看儿子的id里面有没有孙子
			$v['lev']=$lev;
			if($v['parent']==$id){ 
				$subs[]=$v;	//举例说找到的北京的,但是北京下面有没有分类,不知道,需要找一下,所以需要再次调用一下subtree把id传过去array('id'=>'1','name'=>'北京','parent'=>'0'),
				subtree($arr,$v['id'],$lev+1);
			}
		}
	 return $subs;
	}

function subtree($arr,$id=0,$lev=1){
		//$id栏目的儿子有哪些呢?
		//答数组循环一遍,谁的parent值等于$id,谁就是它儿子

		 $subs=array(); //子栏目数组
		 print_r($subs);
		foreach($arr as $v){
				//我想子孙数的话,就要把儿子的$id,传过来,看儿子的id里面有没有孙子
			$v['lev']=$lev;
			if($v['parent']==$id){ 
				$subs[]=$v;	//举例说找到的北京的,但是北京下面有没有分类,不知道,需要找一下,所以需要再次调用一下subtree把id传过去array('id'=>'1','name'=>'北京','parent'=>'0'),
				$subs=array_merge($subs,subtree($arr,$v['id'],$lev+1));
			}
		}
	 return $subs;
	}
echo '<br />';
	//print_r(subtree($arr,0));
	$tree=subtree($arr,0,1);
	//使用层级方式输出
	foreach($tree as $v){
		echo str_repeat('  ',$v['lev']),$v['name'],'<br />';
	}
在函数中声明的static 静态变量,
无论此函数调用多少次,只初始化一次


以后就会直接沿用该变量
这在递归时,很有用


static总结
1:修饰类的属性与方法为静态属性,静态方法
2.static::method,延迟绑定
3.在函数/方法中,声明静态

家谱树如下:

function familytree($arr,$id){
		 $tree=array();
		//把这个id自身找出来
		foreach($arr as $v){
			if($v['id']==$id){
		
				//判断要不要找父栏目,
				if($v['parent']>0){//pareng>0,说明有父栏目
					$tree=array_merge($tree,familytree($arr,$v['parent']));
				}
					$tree[]=$v;
			}

		}
		return $tree;
	}

	print_r(familytree($arr,8));  //三里->朝阳->北京
家谱树使用迭代:

//迭代,效率比递归高,代码也没多,
//找家谱树推荐用迭代	
function tree($arr,$id){
		$tree=array();

		while($id!=0){
			foreach($arr as $v){
				if($v['id']==$id){
					$tree[]=$v;
					$id=$v['parent'];
				break;
			}	
		}
	}
	return $tree;
}

print_r(tree($arr1,8));

使用迭代法查找子孙树

//任务表 先找0的单元,找到北京了 id为1  找parent=1的栏目 朝阳 又找到三里屯和三里

	//$task=[0,1,4,6/8]
function subtree($arr,$parent=0){
	$task=array($parent); //任务表
	$tree=array(); //地区表
	while(!empty($task)){
		$flag=false;
		foreach($arr as $k=>$v){
			
			if($v['parent']==$parent){
				$tree[]=$v;
				array_push($task,$v['id']);//把最新的地区id入任务栈
				$parent=$v['id'];
				unset($arr[$k]);//把找到的单元unset掉
				$flag=true; //说明找到了子栏目

			}	
		}
		if($flag==false){
			array_pop($task);
			$parent=end($task);
		}
		print_r($task);
	}
	return $tree;
}

	print_r(subtree($arr,0));

这些都是从燕十八老师讲的商城项目学的 ,感谢燕十八老师的公益课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值