网站推广.NET

网站推广.NET

php递归实现无限级分类树

来源:互联网

无限级树状图可以说是无限级栏目的一个显著特征,我们接下来就来看看两种不同的写法。

一.数据库设计

CREATE TABLE `bg_cate` (`cate_Id` int(30) unsigned NOT NULL AUTO_INCREMENT,`cate_ParentId` int(30) unsigned DEFAULT '0',`cate_Name` varchar(100) NOT NULL,`cate_Intro` varchar(500) DEFAULT NULL,`cate_Order` int(30) unsigned DEFAULT '0',`cate_Icon` varchar(100) DEFAULT NULL,PRIMARY KEY (`cate_Id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ;---- 导出表中的数据 `bg_cate`--insert INTO `bg_cate` (`cate_Id`, `cate_ParentId`, `cate_Name`, `cate_Intro`, `cate_Order`, `cate_Icon`) valUES(4, 0, '往事如风', '记录往事', 0, 'icons/6.gif'),(5, 0, '水煮三国', '品位三国智慧', 0, 'icons/3.gif'),(2, 0, '技术学习', '平时学习的一些笔记,欢迎批评指正。', 0, 'icons/18.gif'),(3, 0, '生活点滴', '记录生活点滴', 0, 'icons/2.gif'),(6, 0, '栀子花开', '青春无限', 0, 'icons/8.gif'),(7, 0, '假日休闲', '悠闲、自在', 0, 'icons/24.gif'),(8, 2, 'html', 'html学习', 0, 'icons/1.gif'),(9, 2, 'css', 'css学习', 0, 'icons/1.gif'),(10, 2, 'php', 'php学习', 0, 'icons/18.gif'),(11, 10, 'php基础知识', 'php基础知识', 0, 'icons/1.gif'),(12, 10, 'oop', 'oop', 0, 'icons/1.gif'),(13, 10, 'php安全', '讲述php安全', 0, 'icons/1.gif'),(14, 10, 'seagull framework', 'seagull framework', 0, 'icons/1.gif'),(15, 2, 'javascript', 'javascript学习', 0, 'icons/1.gif'),(16, 2, '设计模式', NULL, 0, 'icons/1.gif'),(17, 2, '软件工程', '软件工程学习', 0, 'icons/1.gif'),(18, 3, '厦门生活', '厦门生活', 0, 'icons/8.gif'),(19, 3, '大学生活', '大学生活', 0, 'icons/8.gif'),(20, 3, '童年生活', '童年生活', 0, 'icons/15.gif'),(21, 19, '学习', '学习', 0, 'icons/1.gif'),(22, 19, '运动', '运动', 0, 'icons/16.gif'),(23, 19, '旅游', '旅游', 0, 'icons/24.gif'),(24, 22, '排球', '排球', 0, 'icons/9.gif'),(25, 22, '篮球', '篮球', 0, 'icons/9.gif'),(26, 22, '羽毛球', '羽毛球', 0, 'icons/9.gif'),(27, 22, '乒乓球', '乒乓球', 0, 'icons/9.gif');

二.到数据库取数据,放到数组。

require_once &#39;./classes/MyDB.php&#39;;$con = MyDB::singleton();$sql = <<<SQL   select * from bg_cate cateSQL;$data = $con->getAll($sql);//print_r($data);

数据库操作我用的是pear类库。
最后的$data的数据格式如下:

Array(   [0] => Array       (           [cate_Id] => 4           [cate_ParentId] => 0           [cate_Name] => 往事如风           [cate_Intro] => 记录往事           [cate_Order] => 0           [cate_Icon] => icons/6.gif       )   [1] => Array       (           [cate_Id] => 5           [cate_ParentId] => 0           [cate_Name] => 水煮三国           [cate_Intro] => 品位三国智慧           [cate_Order] => 0           [cate_Icon] => icons/3.gif       )

三.把上一步的数据转为树型状的数组
代码如下:

立即学习“PHP免费学习笔记(深入)”;

function getTree($data, $pId){$tree = &#39;&#39;;foreach($data as $k => $v){  if($v[&#39;cate_ParentId&#39;] == $pId)  {        //父亲找到儿子   $v[&#39;cate_ParentId&#39;] = getTree($data, $v[&#39;cate_Id&#39;]);   $tree[] = $v;   //unset($data[$k]);  }}return $tree;}$tree = getTree($data, 0);

最后输出$tree的数据格式为:

Array(   [0] => Array       (           [cate_Id] => 4           [cate_ParentId] =>           [cate_Name] => 往事如风           [cate_Intro] => 记录往事           [cate_Order] => 0           [cate_Icon] => icons/6.gif       )   [1] => Array       (           [cate_Id] => 5           [cate_ParentId] =>           [cate_Name] => 水煮三国           [cate_Intro] => 品位三国智慧           [cate_Order] => 0           [cate_Icon] => icons/3.gif       )   [2] => Array       (           [cate_Id] => 2           [cate_ParentId] => Array               (                   [0] => Array                       (                           [cate_Id] => 8                           [cate_ParentId] =>                           [cate_Name] => html                           [cate_Intro] => html学习                           [cate_Order] => 0                           [cate_Icon] => icons/1.gif                       )

四.把树型状数组转为html
代码如下:

function procHtml($tree){$html = &#39;&#39;;foreach($tree as $t){  if($t[&#39;cate_ParentId&#39;] == &#39;&#39;)  {   $html .= "<li>{$t[&#39;cate_Name&#39;]}</li>";  }  else  {   $html .= "<li>".$t[&#39;cate_Name&#39;];   $html .= procHtml($t[&#39;cate_ParentId&#39;]);   $html = $html."</li>";  }}return $html ? &#39;<ul>&#39;.$html.&#39;</ul>&#39; : $html ;}echo procHtml($tree);

输出的html的代码格式为:

<ul><li>往事如风</li><li>水煮三国</li><li>技术学习  <ul>   <li>html</li>   <li>css</li>   <li>php    <ul>     <li>php基础知识</li>     <li>oop</li>     <li>php安全</li>

五.代码整合

function getTree($data, $pId){$html = &#39;&#39;;foreach($data as $k => $v){  if($v[&#39;cate_ParentId&#39;] == $pId)  {        //父亲找到儿子   $html .= "<li>".$v[&#39;cate_Name&#39;];   $html .= getTree($data, $v[&#39;cate_Id&#39;]);   $html = $html."</li>";  }}return $html ? &#39;<ul>&#39;.$html.&#39;</ul>&#39; : $html ;}echo getTree($data, 0);

六.增加CSS样式


第二种是从开源网站上看到的,非常非常的简介。

<?php function genTree5($items) {     foreach ($items as $item)         $items[$item[&#39;pid&#39;]][&#39;son&#39;][$item[&#39;id&#39;]] = &$items[$item[&#39;id&#39;]];     return isset($items[0][&#39;son&#39;]) ? $items[0][&#39;son&#39;] : array(); }  /** * 将数据格式化成树形结构 * @author Xuefen.Tong * @param array $items * @return array  */function genTree9($items) {    $tree = array(); //格式化好的树    foreach ($items as $item)        if (isset($items[$item[&#39;pid&#39;]]))            $items[$item[&#39;pid&#39;]][&#39;son&#39;][] = &$items[$item[&#39;id&#39;]];        else            $tree[] = &$items[$item[&#39;id&#39;]];    return $tree;} $items = array(    1 => array(&#39;id&#39; => 1, &#39;pid&#39; => 0, &#39;name&#39; => &#39;江西省&#39;),    2 => array(&#39;id&#39; => 2, &#39;pid&#39; => 0, &#39;name&#39; => &#39;黑龙江省&#39;),    3 => array(&#39;id&#39; => 3, &#39;pid&#39; => 1, &#39;name&#39; => &#39;南昌市&#39;),    4 => array(&#39;id&#39; => 4, &#39;pid&#39; => 2, &#39;name&#39; => &#39;哈尔滨市&#39;),    5 => array(&#39;id&#39; => 5, &#39;pid&#39; => 2, &#39;name&#39; => &#39;鸡西市&#39;),    6 => array(&#39;id&#39; => 6, &#39;pid&#39; => 4, &#39;name&#39; => &#39;香坊区&#39;),    7 => array(&#39;id&#39; => 7, &#39;pid&#39; => 4, &#39;name&#39; => &#39;南岗区&#39;),    8 => array(&#39;id&#39; => 8, &#39;pid&#39; => 6, &#39;name&#39; => &#39;和兴路&#39;),    9 => array(&#39;id&#39; => 9, &#39;pid&#39; => 7, &#39;name&#39; => &#39;西大直街&#39;),    10 => array(&#39;id&#39; => 10, &#39;pid&#39; => 8, &#39;name&#39; => &#39;东北林业大学&#39;),    11 => array(&#39;id&#39; => 11, &#39;pid&#39; => 9, &#39;name&#39; => &#39;哈尔滨工业大学&#39;),    12 => array(&#39;id&#39; => 12, &#39;pid&#39; => 8, &#39;name&#39; => &#39;哈尔滨师范大学&#39;),    13 => array(&#39;id&#39; => 13, &#39;pid&#39; => 1, &#39;name&#39; => &#39;赣州市&#39;),    14 => array(&#39;id&#39; => 14, &#39;pid&#39; => 13, &#39;name&#39; => &#39;赣县&#39;),    15 => array(&#39;id&#39; => 15, &#39;pid&#39; => 13, &#39;name&#39; => &#39;于都县&#39;),    16 => array(&#39;id&#39; => 16, &#39;pid&#39; => 14, &#39;name&#39; => &#39;茅店镇&#39;),    17 => array(&#39;id&#39; => 17, &#39;pid&#39; => 14, &#39;name&#39; => &#39;大田乡&#39;),    18 => array(&#39;id&#39; => 18, &#39;pid&#39; => 16, &#39;name&#39; => &#39;义源村&#39;),    19 => array(&#39;id&#39; => 19, &#39;pid&#39; => 16, &#39;name&#39; => &#39;上坝村&#39;),);echo "<pre class="brush:php;toolbar:false">";print_r(genTree5($items));print_r(genTree9($items)); //后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构/*Array([0] => Array    (        [id] => 1        [pid] => 0        [name] => 江西省        [son] => Array            (                [0] => Array                    (                        [id] => 3                        [pid] => 1                        [name] => 南昌市                    )                 [1] => Array                    (                        [id] => 13                        [pid] => 1                        [name] => 赣州市                        [son] => Array                            (                                [0] => Array                                    (                                        [id] => 14                                        [pid] => 13                                        [name] => 赣县                                        [son] => Array                                            (                                            [0] => Array                                                (                                                    [id] => 16                                                    [pid] => 14                                                    [name] => 茅店镇                                                    [son] => Array                                                        (                                                        [0] => Array                                                            (                                                            [id] => 18                                                            [pid] => 16                                                            [name] => 义源村                                                            )                                                         [1] => Array                                                            (                                                            [id] => 19                                                            [pid] => 16                                                            [name] => 上坝村                                                            )                                                         )                                                 )                                             [1] => Array                                                (                                                    [id] => 17                                                    [pid] => 14                                                    [name] => 大田乡                                                )                                             )                                     )                                 [1] => Array                                    (                                        [id] => 15                                        [pid] => 13                                        [name] => 于都县                                    )                             )                     )             )     ) [1] => Array    (        [id] => 2        [pid] => 0        [name] => 黑龙江省        [son] => Array            (                [0] => Array                    (                        [id] => 4                        [pid] => 2                        [name] => 哈尔滨市                        [son] => Array                            (                            [0] => Array                                (                                    [id] => 6                                    [pid] => 4                                    [name] => 香坊区                                    [son] => Array                                        (                                        [0] => Array                                            (                                                [id] => 8                                                [pid] => 6                                                [name] => 和兴路                                                [son] => Array                                                    (                                                        [0] => Array                                                            (                                                            [id] => 10                                                            [pid] => 8                                                            [name] =>                                                              东北林业大学                                                            )                                                         [1] => Array                                                            (                                                            [id] => 12                                                            [pid] => 8                                                            [name] =>                                                             哈尔滨师范大学                                                            )                                                     )                                             )                                         )                                 )                             [1] => Array                                (                                    [id] => 7                                    [pid] => 4                                    [name] => 南岗区                                    [son] => Array                                        (                                        [0] => Array                                            (                                            [id] => 9                                            [pid] => 7                                            [name] => 西大直街                                            [son] => Array                                                (                                                [0] => Array                                                    (                                                    [id] => 11                                                    [pid] => 9                                                    [name] =>                                                      哈尔滨工业大学                                                    )                                                 )                                             )                                         )                                 )                             )                     )                 [1] => Array                    (                        [id] => 5                        [pid] => 2                        [name] => 鸡西市                    )             )     ))*/

可以看出第二种代码只用了5行代码就实现了无限级的分类树,非常值得大家的借鉴和学习。

想要了解更多PHP的相关资讯,请继续关注php中文

【更多类库下载】

1. php分页库下载 2. php图片处理类库 3. 验证码类库下载 4. 文件上传类库 5. 字符串处理类 
6. 分类库  7.数据库操作类库  8.ip类库   9.缓存类库 10.模板引擎类库 

相关文章:

php用递归方法实现无限级分类

揭露php无限级分类的原理

php无限级分类实现方法分析

php中文