没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
无限级分类原理及代码实现
一、原理
我们先把分类按照水平方式摆开。从根节点开始(“Food”),然
后他的左边写上 1。然后按照树的顺序(从上到下)给“Fruit”的左
边写上 2。这样,你沿着树的边界走啊走(这就是“遍历”),然后同
时在每个节点的左边和右边写上数字。最后,我们回到了根节点
“Food”在右边写上 18。下面是标上了数字的树,同时把遍历的顺
序用箭头标出来了。
我
们称这
些数字
为左值和右值(如,“Food”的左值是 1,右值是 18)。正如你所见 ,
这些数字按时了每个节点之间的关系。因为“Red”有 3 和 6 两个值,
所以,它是有拥有 1-18 值的“Food”节点的后续。同样的,我们可
以推断所有左值大于 2 并且右值小于 11 的节点,都是有 2-11 的
“Fruit” 节点的后续。这样,树的结构就通过左值和右值储存下来了。
这种数遍整棵树算节点的方法叫做“改进前序遍历树”算法。
二、表结构设计:
Id int 自动增加
Name varchar(50) 分类名称
Lft int 分类左值
Rgt int 分类右值
注:表的名称命名为“fenlei”,以下实例对此表进行操作。
三、分类操作 sql 语句的实现(以 php 操作 mssql 为例)
1、分类的添加
在分类 ID 下添加新分类。
$sql_str="select * from fenlei where id=".strval($id); //$id 为分类的 ID
$fun_result = mssql_query($sql_str);
$fun_row=mssql_fetch_array($fun_result);
//获取分类的左值和右值
$i_lft=$fun_row['lft'];
$i_rgt=$fun_row['rgt'];
//计算出新增加分类的左值和右值
$i_lft_now=$i_rgt;
$i_rgt_now=$i_rgt+1;
//增加分类以前,先对所有大于等于父分类左值、右值的值统一加 2
$sql="update fenlei set lft=lft+2 where lft>=".strval($i_rgt);
imssql_query($sql);
$sql="update fenlei set rgt=rgt+2 where rgt>=".strval($i_rgt);
imssql_query($sql);
//在数据库里增加新增加分类,左值和右值分别为$i_lft_now 和$i_rgt_now,,分类名称
为$name
$sql="insert fenlei (name,lft,rgt) values ('".iconv("utf-8","gb2312",
$name)."',".strval($i_lft_now).",".strval($i_rgt_now).")";
mssql_query($sql);
2、分类的删除
删除分类 ID 为$id 的分类
$sql_str="select * from fenlei where id=".strval($id);
$fun_result = mssql_query($sql_str);
$fun_row=mssql_fetch_array($fun_result);
//获取分类的右值
$i_rgt=$fun_row['rgt'];
//从数据库里删除该分类
$sql="delete from fenlei where id=".strval($id);
mssql_query($sql);
//所有左值和右值大于$i_rgt 的值都减 2;
$sql="update fenlei set lft=lft-2 where lft>".strval($i_rgt);
mssql_query($sql);
$sql="update fenlei set rgt=rgt-2 where rgt>".strval($i_rgt);
mssql_query($sql);
3、分类的移动
ID 为$id_sou 的分类移动到 ID 为$id_des 父分类下
//先删除分类
$sql_str="select * from fenlei where id=".strval($id_sou);
$fun_result = mssql_query($sql_str);
$fun_row=mssql_fetch_array($fun_result);
$i_rgt=$fun_row['rgt'];
$name=$fun_row['name'];
$sql="delete from fenlei where id=".strval($id_sou);
mssql_query($sql);
$sql="update fenlei set lft=lft-2 where lft>".strval($i_rgt);
mssql_query($sql);
$sql="update fenlei set rgt=rgt-2 where rgt>".strval($i_rgt);
mssql_query($sql);
//再添加分类
$sql_str="select * from fenlei where id=".strval($id_des);
$fun_result = mssql_query($sql_str);
$fun_row=mssql_fetch_array($fun_result);
$i_lft=$fun_row['lft'];
$i_rgt=$fun_row['rgt'];
剩余13页未读,继续阅读
oligaga
- 粉丝: 52
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python代码案例详解-旅行商问题的多种求解算法.zip
- springcloud.rar
- 一键清理maven项目依赖下载失败生成的.lastUpdated文件, 以及解决无法连接远程仓库导致本地依赖找不到的批处理脚本
- C#+WPF开发IOC框架实战架构师课程
- 《JAVA WEB项目开发案例精粹》中的代码案例源文件(超全).rar
- 背景music,用作业网轮地址
- comment_6e56cd5d6e140046ef1cd248910ea5ca.png
- 基于卷积神经网络的自动驾驶系统的设计与实现
- MySQL的执行原理-2.md
- 基于 FCN 网络对无人机俯拍下的生活场景语义分割(12类别)【包含数据集、完整代码、训练好的结果、权重文件等等】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0