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>";
posted @ 2012-06-29 16:56  cntnn11  阅读(730)  评论(0编辑  收藏  举报