<?php $arr=array( array('id'=>1,'name'=>'河南省','pid'=>0), array('id'=>2,'name'=>'信阳市','pid'=>1), array('id'=>3,'name'=>'开封市','pid'=>1), array('id'=>6,'name'=>'广州市','pid'=>4), array('id'=>4,'name'=>'广东省','pid'=>0), array('id'=>5,'name'=>'深圳市','pid'=>4), ); function digui($data,$pid=0) { $arr=array(); foreach($data as $v){ if($v['pid']==$pid){ $arr[]=$v; $arr=array_merge($arr,digui($data,$v['id'])); } } return $arr; } function diedai($data,$id=0) { $task=array($id);//任务表此时放进的$id是为了找儿子,然后再儿子中找孙子, $tree=array();//地区表 while(!empty($task)) { $flag=false; foreach($data as $k=>$v) { if($v['pid']==$id) { $tree[]=$v;//把找到的项放进$tree数组 array_push($task,$v['id']);//每次把找到的儿子的id加进来 $id=$v['id'];//每次把$id设成刚加进来的一项的id unset($data[$k]);//把找到的项删除,此处类似排除法 $flag=true;//执行这一步说明上面的$id找到儿子了,如果为false说明这一if语句根本没执行同时说明最后 //的$id没儿子,然后执行下面的if语句,把$id设为倒数第二项 } } if($flag==false) {//当执行这一步时 说明上一步的foreach没执行也就是说明$task最后一项没找到孩子 array_pop($task);//删除最后一项 $id=end($task);//把$id设为倒数第二项,放到上面的foreach里去执行,找倒数第二项的儿子 } } return $tree; } var_dump(diedai($arr)); ?>
|