<?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删除干净已经没有单元,所以也为了空,停止一切循环
*/
?>
不知道理解的对不对。