linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > php >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·PHP生成静态页面的一些经验
·PHP无限分类与树型论坛的实现方
·php5学习笔记
·入门级PHP程序员面试题
·PHP 和 MySQL初学入门
·PHP入门速成
·vim的代码折叠
·文件下载统计php编程代码
·如何建立自己的新闻发布系统
·织梦CMS中文转换拼音函数研究
·Windows下Apache+Tomcat+MySQL
·PHP初学者头疼问题总结
·Cookie及其使用详细介绍
·生成sessionid和随机密码的例子
·使用无限生命期Session的方法
最新文章
·PHP入门速成
·用php实现广告轮播
·Zend Optimizer 问题浅析
·功能强大的CGI语言----PHP3
·用Session对Web页面进行保护
·PHP--进行模块化设计
·如何将PHP的结果输出到非PHP页
·如何开发一个虚拟域名系统
·PHP4调用自己编写的COM组件
·简单的页面缓冲技术(三)
·简单的页面缓冲技术(二)
·简单的页面缓冲技术(一)
·用Socket发送电子邮件(二)
·用Socket发送电子邮件(一)
·PHP/MySQL 购物车
Google
 
PHP无限分类与树型论坛的实现方法
[ 作者:  加入时间:2007-10-11 12:22:33  来自:Linux联盟收集整理 ]
在此我不想讨论其他实现方法的利与弊。tKJLinux联盟
既然是使用字段排序,那么我们便设一个名为order的字段。问题是,在这里是使用整数还是使用浮点数类型呢?考虑到会有在两个连续order值中间插入新值的可能,自然是需要使用浮点类型了。tKJLinux联盟
建一个menus表,我们还需要以下字段:tKJLinux联盟
id : 类别编号tKJLinux联盟
mainid : 主分类编号,但不作具体分类使用。如果在树型论坛里,它代表的是主题idtKJLinux联盟
parentid : 父类编号tKJLinux联盟
level : 类别级别,作用其实是方便显示的时候作其他处理tKJLinux联盟
info : 类别名称等。tKJLinux联盟
由此可以得到menus的表结构:tKJLinux联盟
CREATE TABLE `menus` (tKJLinux联盟
`id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT ,tKJLinux联盟
`mainid` INT( 10 ) UNSIGNED NOT NULL ,tKJLinux联盟
`parentid` INT( 10 ) UNSIGNED NOT NULL ,tKJLinux联盟
`order` FLOAT UNSIGNED NOT NULL ,tKJLinux联盟
`level` SMALLINT( 5 ) UNSIGNED NOT NULL ,tKJLinux联盟
`info` VARCHAR( 128 ) NOT NULL ,tKJLinux联盟
INDEX ( `mainid` , `parentid` , `order` , `level` ) ,tKJLinux联盟
UNIQUE (tKJLinux联盟
`id` tKJLinux联盟
)tKJLinux联盟
) TYPE = MYISAM ;tKJLinux联盟
tKJLinux联盟
很容易可以看出,输入的时候是如此简单便实现树结构了:tKJLinux联盟
SELECT * FROM `menus` ORDER BY `mainid` ASC, `order` ASC ;tKJLinux联盟
前提是添加类别的时候,order能正确排序。tKJLinux联盟
tKJLinux联盟
添加根分类:tKJLinux联盟
很简单,取得上一个主类的mainid, 如A_mainid,则新根分类的mainid则为A_mainid + 1。parentid 为 0 , order 为0, level也为0, info则自行设定。tKJLinux联盟
tKJLinux联盟
添加子分类:tKJLinux联盟
核心思想是,取得新增子分类的前一个分类的order以及它后一个分类的order。tKJLinux联盟
取得前一个分类的order是这里的难点,因为涉及到同级与非同级的情况。非同级的情况很简单,新增别类的前一个order其实就是它的父类的order。如果有同级分类,情况就很复杂了,因为它前面的同级分类有可能会拥有子分类,子分类下又可能还会有子分类,如此下来,要取得前一个order就很难了。tKJLinux联盟
解决的办法有两个:tKJLinux联盟
1.取得新增类同级的前一个类别,如类别A的ID,使用递归的方法,直到取得A类别下最后最小分类的order,那便是要新增分类的前一个order了。这种方法的缺点是,如果A类别下有很多子分类,那么递归需要一定的时间。这种方法适用于普通的分类处理,不适用于树型论坛。不过总体来说,因为是添加类别的时候才使用递归,输出类别的时候跟前面一样,效率还是很高的。tKJLinux联盟
2.作一个记录,记录着与A有关联的最后order。于是我们就需要增加一个表,建利关系树。这种关系树做起来很简单。表结构如下:tKJLinux联盟
CREATE TABLE `menu_tree` (tKJLinux联盟
`mainid` int(10) unsigned NOT NULL default '0',tKJLinux联盟
`tree` text NOT NULL,tKJLinux联盟
`order` float unsigned NOT NULL default '0',tKJLinux联盟
KEY `mainid` (`mainid`,`order`),tKJLinux联盟
FULLTEXT KEY `tree` (`tree`)tKJLinux联盟
) TYPE=MyISAM;tKJLinux联盟
(构建方式请看我后面给出的源码)tKJLinux联盟
取得前一个order之后,要取得后一个order就很简单了。取同mainid下大于前一个order的最小order便是了。如果存在后一个order,那么新增order就取前一个order与后一个order的平均值。如果不存在后一个order,那说明新增类别是main下的最小order,取大于前一个order的最小整数就行了。tKJLinux联盟
tKJLinux联盟
主要实现方法便如上面说的。

处理方法

tKJLinux联盟

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Javascript无限分类算法的实现  (2007-10-15 12:44:51)