文档章节

php实现无限级树型菜单(函数递归算法)

rin9958
 rin9958
发布于 2016/04/05 20:51
字数 907
阅读 166
收藏 7

大概步骤如下: 首先到数据库取数据,放到一个数组, 然后把数据转化为一个树型状的数组, 最后把这个树型状的数组转为html代码。 也可以将第二步和第三步合为一步。

详细如下: 1。数据库设计: 脚本如下:

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');

2。到数据库取数据,放到数组。

require_once './classes/MyDB.php';
$con = MyDB::singleton(); 
$sql = <<<SQL
    select * from bg_cate cate 
SQL;
$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
        )
。。。。。。

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

function getTree($data, $pId)
{
$tree = '';
foreach($data as $k => $v)
{
   if($v['cate_ParentId'] == $pId)
   {         //父亲找到儿子
    $v['cate_ParentId'] = getTree($data, $v['cate_Id']);
    $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
                        )
。。。。。。。。。。。

4。把树型状数组转为html 代码如下:

function procHtml($tree)
{
$html = '';
foreach($tree as $t)
{
   if($t['cate_ParentId'] == '')
   {
    $html .= "<li>{$t['cate_Name']}</li>";
   }
   else
   {
    $html .= "<li>".$t['cate_Name'];
    $html .= procHtml($t['cate_ParentId']);
    $html = $html."</li>";
   }
}
return $html ? '<ul>'.$html.'</ul>' : $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>
。。。。。。。。。。。。。。。。

5。也可以把第3和第4步的代码合在一起,代码如下:
function getTree($data, $pId)
{
$html = '';
foreach($data as $k => $v)
{
   if($v['cate_ParentId'] == $pId)
   {         //父亲找到儿子
    $html .= "<li>".$v['cate_Name'];
    $html .= getTree($data, $v['cate_Id']);
    $html = $html."</li>";
   }
}
return $html ? '<ul>'.$html.'</ul>' : $html ;
}
echo getTree($data, 0);

转载自:http://www.9958.pw/post/php_cat_pid

© 著作权归作者所有

共有 人打赏支持
rin9958
粉丝 9
博文 113
码字总数 54109
作品 0
程序员
私信 提问
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例

我们经常需要在关系型数据库中保存一些树状结构数据,比如分类、菜单、论坛帖子树状回复等。常用的方法有两种: 1. 领接表的方式; 2. 预排序遍历树方式; 假设树状结构如下图: 领接表方式 ...

我心中有猛狗
2016/10/29
43
0
利用内存多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

利用内存多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法) 一、问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开...

星星知我心
2012/01/30
2.9K
4
thinkphp3.1无限级分类模块的设计

实现无限级分类一般只用一个数据表,通常可通过递归和非递归两种方法来实现。递归方法必须使用递归 调用方式才能进行数据遍历,删除等操作,所以需要发送多次查询数据库语句,非常影响执行效...

网菠萝果
2013/03/23
0
1
利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

一、问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一。在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来...

Alex_曰生
2014/12/01
0
2
php递归算法

递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去。实现递归函数可以采取什么方式呢?本文列出了三种基本方式。理解其...

微雨初晴
2016/11/26
9
0

没有更多内容

加载失败,请刷新页面

加载更多

十月开源项目推荐:专为 Python 初学者准备的 IDE 你用过吗?

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
22分钟前
6
0
Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先

排序规则 因为是中国人,习惯性看中文文件夹放前面比较顺眼,所以在别人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基础上,加上了自己的排序规则。 默认排序规则...

她叫我小渝
23分钟前
0
0
RabbitMQ通过shovel插件迁移数据

前言 生产环境中会遇到RabbitMQ数据迁移的场景,例如:切换云服务厂商、不同Region之间数据迁移、新搭建RabbitMQ实例,数据需要同步至新的RabbitMQ实例。 前提条件: 源RabbitMQ实例打开了s...

中间件小哥
26分钟前
0
0
kubernetes 环境搭建

kubernetes 简介:Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful)。 点击此处查看官网详情。...

MrPei
41分钟前
1
0
关于scala macro的example

http://www.bbartosz.com/blog/2016/09/24/fun-with-scalameta-examples-part1/

Littlebox
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部