php 无限分类
算法,各种算法对一个数学很烂的人来说真是一个严重的打击!!!但谁让咱干程序这行呢(哭)。
搞了几小时,参照 http://yuepin.com/Explore/tree.php? 该网址的说明实例,可算是明白一点,下边代码,给自己留个笔记。
注:因为是无限次的调用,所以我加了个判断,在层级$level=10的时候让他跳出。没有哪个正常网站会放超过10层的目录结构吧。
执行到static变量后,判断下当前层级,如果层级为0,那么表示这是最高级菜单,需要清空$arrcate的数据重新声明!
不这么做的话,在一张页面里调用两次或者多次,他会保留上次调用该方法时的值
1 $yArr = array( 2 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), 3 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), 4 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'), 5 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'), 6 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'), 7 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'), 8 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二'), 9 8 => array('id'=>'8','parentid'=>2,'name'=>'二级栏目三'), 10 ); 11 12 /** 13 * 获取当前id的子ID 14 * @param array $data 原始数组 15 * @param int $id 当前id 16 * @param int $layer 当前层级 17 */ 18 function genCate($data, $pid = 0, $level = 0) 19 { 20 if($level == 10) break; 21 $l = str_repeat(" ", $level); 22 $l = $l.'└'; 23 static $arrcat = array(); 24 $arrcat = empty($level) ? array() : $arrcat; 25 foreach($data as $k => $row) 26 { 27 /** 28 * 如果父ID为当前传入的id 29 */ 30 if($row['parentid'] == $pid) 31 { 32 //如果当前遍历的id不为空 33 $row['name'] = $l.$row['name']; 34 $row['level'] = $level; 35 $arrcat[] = $row; 36 //var_array($arr); 37 genCate($data, $row['id'], $level+1);//递归调用 38 } 39 } 40 return $arrcat; 41 } 42 43 $carr = genCate($yArr); 44 echo "<select>"; 45 foreach($carr as $row) 46 { 47 echo "<option value={$row['id']}>"; 48 echo $row['name']; 49 echo "</option>"; 50 } 51 echo "</select>";