PHP无限极分类——使用迭代法

<?php
	
	

	$arr = array(
				array('id' => 1, 'name' => '湖北', 'pid' => 0),
				array('id' => 2, 'name' => '武汉', 'pid' => 1),
				array('id' => 3, 'name' => '北京', 'pid' => 0),
				array('id' => 4, 'name' => '东城区', 'pid' => 3),
				array('id' => 5, 'name' => '西城区', 'pid' => 3),
				array('id' => 6, 'name' => '东宝区', 'pid' => 7),
				array('id' => 7, 'name' => '荆门', 'pid' => 2),
				array('id' => 8, 'name' => '竹园街', 'pid' => 6),
	);



	// 使用迭代找家谱
	/*
	*	end — 将数组的内部指针指向最后一个单元
	*	array_push — 将一个或多个单元压入数组的末尾(入栈
	*	array_pop — 将数组最后一个单元弹出(出栈)
	*	array_unshift — 在数组开头插入一个或多个单元
	*
	*/

	function diedai($arr,$pid = 0){
		$task = array($pid); //任务表
		$tree = array(); //地区表(存放找到的数据)
		// 如果任务表为不空就执行循环
		while (!empty($task)) {
			$flag = false; //定义一个参数为假,用于判断有没有找到子栏目
			foreach ($arr as $key => $value) {
				// 如果$arr的值得pid = 参数传来的pid就执行(初始也就是0)所以先会输出湖北和北京
				if ($value['pid'] == $pid) {
					$tree[] = $value; //将找到的值写入到 地区表
					array_push($task, $value['id']); //把找到的地区id加入任务栈,用于记录
					$pid = $value['id']; //在把该地区的id赋给 $pid 便于下次循环
					unset($arr[$key]); //把找到单元unset掉
					$flag = true; //说明找到了子栏目
				}
			}
			//当循环到底的时候(也就是没有id对应的pid时)循环就不为真,便将执行上面定义的那个假参数
			if ($flag == false){
				array_pop($task); //会将任务表中的id从后到前删除
				$pid = end($task); //将任务表的内部指针,移到最后一个单元,并将他赋给pid
			}
			// print_r($task);打开可以看到任务表的运行过程
		}
		return $tree; //返回地区表
	}

	$a = diedai($arr);
	var_dump($a);

	/*
	任务表
		当循环第一次的时候他的初始pid为0		->		所以会打印出(湖北和北京)		
		第二次时,按照数组的顺序 湖北 的id已经赋给了 任务表所以此时它的pid为 1		->		打印出武汉
		第三次时,任务表的pid已为2		->		打印荆门
		.....N次,当找不到子栏目时(也就是false,到pid为8时,找不到对应的pid为8)
		此时会退出循环去执行下面一个逻辑判断:
			array_pop会把任务表里面的单元格,从最后开始删除
			以下是任务表的运行过程
				0	第一次循环出来 湖北
				1	第二次循环出来 武汉
				2	荆门
				7	东宝区
					此时到了7但是竹园街的pid在6所以他又退了回去去获取

				0   湖北
				1	武汉
				2	荆门
				7	东宝区
				6	竹园街
				8 	此时到了pid到了8 但是pid里面并没有8 所以他开始倒退(删除)
					此时已经退出循环了

				0 	湖北
				1	武汉
				2	荆门
				7	东宝区
				6	竹园街
					
					array_pop函数正在执行删除功能,从最后的单元开始

				0	湖北
				1	武汉
				2	荆门
				7	东宝区
				
				0	湖北
				1	武汉
				2	东宝区

				0	湖北
				1	武汉

				0	这时 他又会到了0 他发现了北京的pid也是0所以 他又继续进入循环

				0	北京
				3 	东城区 这时东城区的pid为3 id为4
				4	pid4 并不存在,所以退出循环

				0	执行下面的逻辑判断
				3 	西城区 倒退到了pid为3   他发现西城区的pid也为3 所以又进入循环将西城区提取到地区表

	
				0	
				3 	
				5	这时候pid为5 但是并没有pid为5的地区 所以又退出了循环
					
				0	
				3 		

				0	这时又重新退回到了0
				然而这时 任务表 已经被array_pop删除干净已经没有单元,所以也为了空,停止一切循环






	*/

?>

 不知道理解的对不对。

posted @ 2016-02-04 13:33  QingSU  阅读(284)  评论(0编辑  收藏  举报