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