1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?php /** * @Author: Marte * @Date: 2017-04-25 21:24:36 * @Last Modified by: Marte * @Last Modified time: 2017-04-26 14:09:33 */ $area=array( array('id'=>1,'name'=>'广东省','parent'=>0,'level'=>1), array('id'=>2,'name'=>'广州市','parent'=>1,'level'=>2), array('id'=>3,'name'=>'天河区','parent'=>2,'level'=>3), array('id'=>4,'name'=>'东莞市','parent'=>1,'level'=>2), array('id'=>5,'name'=>'长安镇','parent'=>4,'level'=>3), array('id'=>6,'name'=>'石龙镇','parent'=>4,'level'=>3), array('id'=>7,'name'=>'车陂街道','parent'=>3,'level'=>4), array('id'=>8,'name'=>'广西省','parent'=>0,'level'=>1), array('id'=>9,'name'=>'南宁市','parent'=>8,'level'=>2), ); function substree($arr,$parent=0){ $task=array($parent);//任务表,用于存放下一次要查找的id,这里运用栈来处理 $tree=array();//地区表,用于存放已找到的数据 while (!empty($task)) { //如果任务不为空,那么标记为flag $flag=false; foreach ($arr as $k => $v) { //如果数组的parent和输入的parent相等,那么这条数据就是他的下一级(儿子)数据 if ($v['parent']==$parent) { //把找到的数据放入结果集中 $tree[]=$v; //把下一级(儿子)数据的id作为父压栈到任务表中,查找看是否存在下一级(儿子的儿子,也就是孙子) array_push($task,$v['id']); $parent=$v['id']; //把找到的数据删除 unset($arr[$k]); //如果任务为空,那么标记为true $flag=true; } } //如果任务表不为空 if ($flag==false) { //把任务表的最后一个单元出栈 array_pop($task); //并把数组的内部指针指向最后一个单元 $parent=end($task); } //print_r($task); } //处理结束,返回数组 return $tree; } echo '<pre>'; print_r(substree($area,0)); echo '</pre>'; ?> |