0

0

PHP无限分类-上下值实现

php中文网

php中文网

发布时间:2016-06-13 12:28:54

|

1116人浏览过

|

来源于php中文网

原创

PHP无限分类-左右值实现

包含(移动多个节点;移动单个节点;删除多个节点;删除单个节点;新增节点),另附数据库表结构~有问题可以留言(www.webyang.net)。

?

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

下载
 一、db sql语句//db used for php无限分类create table tree(    id int(10) not null primary key auto_increment,    name varchar(255) not null,    lft int(10) not null default 0,    rgt int(10) not null default 0,    status int(1) not null default 0,    index lft (`lft`),    index rgt (`rgt`),    index status(`status`))charset utf8;insert into tree value (null,'Food',1,18,0);insert into tree value (null,'Fruit',2,11,0);insert into tree value (null,'Red',3,6,0);insert into tree value (null,'Cherry',4,5,0);insert into tree value (null,'Yellow',7,10,0);insert into tree value (null,'Banana',8,9,0);insert into tree value (null,'Meat',12,17,0);insert into tree value (null,'Beef',13,14,0);insert into tree value (null,'Pork',15,16,0);二、php文件主键,'root'=>名称) 二选一 父节点(为空时插入最大的父节点) [email protected] array $ndata = array('id'=>主键,'root'=>名称) 二选一 下一个兄弟节点(没有兄弟的时候就不用) [email protected] array $cdata = array('id'=>主键,'root'=>名称) 二选一 当前待移动的节点 */function move_tree_all($pdata=array(),$ndata=array(),$cdata=array()) {    $cid   = $cdata['id'] ? intval($cdata['id']) : '';    $croot = $cdata['root'];    if(!$cid && !$croot) return;    //需自加判断    //1、cdata不能为顶级    //2、cdata不能比$pdata等级高    $adata = get_tree_all($cdata); //获取当前移动节点的所有节点    delete_tree_all($cdata,1); //逻辑删除当前移动节点的所有节点    foreach($adata as $k => $val) {        if($k != 0) {            $pdata = array('root'=>$val['parent']);            insert_tree($pdata,'',$val['name'],1);        } else { //first            insert_tree($pdata,$ndata,$val['name'],1);        }    }}/** *用于移动一个节点(不包括子节点) [email protected] array $pdata = array('id'=>主键,'root'=>名称) 二选一 父节点(为空时插入最大的父节点) [email protected] array $ndata = array('id'=>主键,'root'=>名称) 二选一 下一个兄弟节点(没有兄弟的时候就不用) [email protected] array $cdata = array('id'=>主键,'root'=>名称) 二选一 当前待移动的节点 */function move_tree_item($pdata=array(),$ndata=array(),$cdata=array()) {    $cid   = $cdata['id'] ? intval($cdata['id']) : '';    $croot = $cdata['root'];    if(!$cid && !$croot) return;    //需自加判断    //1、cdata不能为顶级    if(!$croot) {        $sql = "SELECT name from tree where id = $cid";        $result = mysql_query($sql);        $row = mysql_fetch_assoc($result);        $croot = $row['name'];        unset($sql);    }    delete_tree_item($cdata,1);    insert_tree($pdata,$ndata,$croot,1);}/** *用于插入一个节点 [email protected] array $pdata = array('id'=>主键,'root'=>名称) 二选一 父节点(为空时插入最大的父节点) [email protected] array $ndata = array('id'=>主键,'root'=>名称) 二选一 下一个兄弟节点(没有兄弟的时候就不用) [email protected] string $name string 新插入的名称 [email protected] int $update 默认为空,为1时更新插入 */function insert_tree($pdata=array(),$ndata=array(),$name,$update='') {    if(!$name) return;    $pid   = $pdata['id'] ? intval($pdata['id']) : '';    $proot = $pdata['root'];    $nid   = $ndata['id'] ? intval($ndata['id']) : '';    $nroot = $ndata['root'];    //有父无兄(最小的子节点,父节点的最后一个儿子)    if(($pid || $proot) && !($nid || $nroot)) {        $sql    =  $pid ? "SELECT lft, rgt FROM tree WHERE id = '{$pid}';" : "SELECT lft, rgt FROM tree WHERE name = '{$proot}';";        $result = mysql_query($sql);        $row    = mysql_fetch_assoc($result);        unset($sql);        //新节点        $lft  = $row['rgt'];        $rgt  = $lft+1;        if(!$update) {            $sql  = "insert into tree values (null,'{$name}',$lft,$rgt,0);";            $sql1 = "update tree set rgt = rgt+2 where rgt >= {$row['rgt']}";            $sql2 = "update tree set lft = lft+2 where lft >= {$row['rgt']}";        } else {            $sql  = "update tree set lft=$lft,rgt=$rgt,status=0 where name ='{$name}';";            $sql1 = "update tree set rgt = rgt+2 where status =0 and rgt >= {$row['rgt']}";            $sql2 = "update tree set lft = lft+2 where status =0 and lft >= {$row['rgt']}";        }                mysql_query($sql1);        mysql_query($sql2);        mysql_query($sql); //last add new data    }    //有父有兄    if(($pid || $proot) && ($nid || $nroot)) {        $sql    =  $nid ? "SELECT lft, rgt FROM tree WHERE id = '{$nid}';" : "SELECT lft, rgt FROM tree WHERE name = '{$nroot}';";        $result = mysql_query($sql);        $row    = mysql_fetch_assoc($result);        unset($sql);        //新节点        $lft  = $row['lft'];        $rgt  = $lft+1;        if(!$update) {            $sql  = "insert into tree values (null,'{$name}',$lft,$rgt,0);";            $sql1 = "update tree set rgt = rgt+2 where rgt >= {$row['lft']};";            $sql2 = "update tree set lft = lft+2 where lft >= {$row['lft']};";        } else {            $sql  = "update tree set lft=$lft,rgt=$rgt,status=0 where name ='{$name}';";            $sql1 = "update tree set rgt = rgt+2 where status = 0 and rgt >= {$row['lft']};";            $sql2 = "update tree set lft = lft+2 where status = 0 and lft >= {$row['lft']};";        }        mysql_query($sql1);        mysql_query($sql2);        mysql_query($sql); //last add new data    }    //无父无兄(大佬)    if(!($pid || $proot) && !($nid || $nroot)) {        $sql    =  "SELECT max(`rgt`) as rgt FROM tree;";        $result = mysql_query($sql);        $row    = mysql_fetch_assoc($result);        unset($sql);        //新节点        $lft  = 1;        $rgt  = $row['rgt']+2;        if(!$update) {            $sql  = "insert into tree values (null,'{$name}',$lft,$rgt,0);";            $sql1 = "update tree set rgt = rgt+1";            $sql2 = "update tree set lft = lft+1";        } else {            $sql  = "update tree set lft=$lft,rgt=$rgt,status=0 where name ='{$name}';";            $sql1 = "update tree set rgt = rgt+1 where status = 0";            $sql2 = "update tree set lft = lft+1 where status = 0";        }                mysql_query($sql1);        mysql_query($sql2);        mysql_query($sql); //last add new data    }   }/** *用于删除一个节点(包括子节点) [email protected] array $data = array('id'=>主键,'root'=>名称) 二选一 [email protected] int $update 默认为空,为1时逻辑删除 */function delete_tree_all($data,$update='') {    $id   = $data['id'] ? intval($data['id']) : '';    $root = $data['root'];    if(!$id && !$root) return;    $sql    =  $id ? "SELECT lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT lft, rgt FROM tree WHERE name = '{$root}';";    $result = mysql_query($sql);    $row    = mysql_fetch_assoc($result);    unset($sql);    $middle = $row['rgt']-$row['lft']+1;    if(!$update) {        $sql    = "delete from tree where lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."'";        $sql1   = "update tree set rgt = rgt-{$middle} where rgt > {$row['rgt']}";        $sql2   = "update tree set lft = lft-{$middle} where lft > {$row['rgt']}";    } else {        $sql    = "update tree set status = 1 where lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."'";        $sql1   = "update tree set rgt = rgt-{$middle} where status=0 and rgt > {$row['rgt']}";        $sql2   = "update tree set lft = lft-{$middle} where status=0 and lft > {$row['rgt']}";    }        mysql_query($sql);    mysql_query($sql1);    mysql_query($sql2);}/** *用于删除一个节点(不包括子节点) [email protected] array $data = array('id'=>主键,'root'=>名称) 二选一 [email protected] int $update 默认为空,为1时逻辑删除 */function delete_tree_item($data,$update='') {    $id   = $data['id'] ? intval($data['id']) : '';    $root = $data['root'];    if(!$id && !$root) return;    $sql    =  $id ? "SELECT id,lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT id,lft, rgt FROM tree WHERE name = '{$root}';";    $result = mysql_query($sql);    $row    = mysql_fetch_assoc($result);    unset($sql);    if(!$update) {        $sql  = "delete from tree where id = {$row['id']};";        $sql1 = "update tree set rgt = rgt-1,lft = lft -1 where lft > {$row['lft']} and rgt < {$row['rgt']}";        $sql2 = "update tree set lft = lft-2 where lft > {$row['rgt']}";        $sql3 = "update tree set rgt = rgt-2 where rgt > {$row['rgt']}";    } else {        $sql  = "update tree set status = 1 where id = {$row['id']};";        $sql1 = "update tree set rgt = rgt-1,lft = lft -1 where status = 0 and lft > {$row['lft']} and rgt < {$row['rgt']}";        $sql2 = "update tree set lft = lft-2 where status = 0 and lft > {$row['rgt']}";        $sql3 = "update tree set rgt = rgt-2 where status = 0 and rgt > {$row['rgt']}";    }        mysql_query($sql);    mysql_query($sql1);    //can do or not do just right,but not do load empty 2 number in middle    mysql_query($sql2);    mysql_query($sql3);}/** *用于获取所有的节点 [email protected] array $data = array('id'=>主键,'root'=>名称) 二选一 */function get_tree_all($data) {    $id   = $data['id'] ? intval($data['id']) : '';    $root = $data['root'];    if(!$id && !$root) return;    $sql    =  $id ? "SELECT lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT lft, rgt FROM tree WHERE name = '{$root}';";    $result = mysql_query($sql);    $row    = mysql_fetch_assoc($result);    $adata  = array(); //所有数据    $right  = array(); //计数    $prev   = array();    $result = mysql_query("SELECT id,name, lft, rgt FROM tree WHERE lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."' ORDER BY lft ASC ;");    while ($row = mysql_fetch_assoc($result)) {        if (count($right) > 0) {            while ($right[count($right) - 1] < $row['rgt']) { // 检查我们是否应该将节点移出堆栈                array_pop($right);                array_pop($prev);            }        }        $parent  = $prev ? end($prev) : '';        $adata[] = array('id'=>$row['id'],'name'=>$row['name'],'level'=>count($right),'parent'=>$parent);        $right[] = $row['rgt'];        $prev[]  = $row['name'];    }    return $adata;}/** *用于展示分类 [email protected] array $data = array('id'=>主键,'root'=>名称) 二选一 */function display_tree($data) {    $id   = $data['id'] ? intval($data['id']) : '';    $root = $data['root'];    if(!$id && !$root) return;    $sql    =  $id ? "SELECT lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT lft, rgt FROM tree WHERE name = '{$root}';";    $result = mysql_query($sql);    $row    = mysql_fetch_assoc($result);    $right  = array();    $result = mysql_query("SELECT name, lft, rgt FROM tree WHERE lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."' ORDER BY lft ASC ;");    while ($row = mysql_fetch_assoc($result)) {        if (count($right) > 0) { // 检查我们是否应该将节点移出堆栈            while ($right[count($right) - 1] < $row['rgt']) {                array_pop($right);            }        }        echo str_repeat('  ',count($right)) . $row['name'] . "\n";        $right[] = $row['rgt'];    }}mysql_connect('localhost','root','') or die('connect error');mysql_select_db('test') or die('database error');mysql_query('set names utf8');display_tree(array('root'=>'Food'));//display_tree(array('root'=>'bigboss'));//move_tree_all($pdata=array('root'=>'Fruit'),$ndata=array('root'=>'Red'),$cdata=array('root'=>'Meat'));//move_tree_all('','',$cdata=array('root'=>'Meat'));//move_tree_item('','',array('root'=>'Red'));//move_tree_item(array('root'=>'Red'),array('root'=>'Cherry'),array('root'=>'Fruit'));//delete_tree_all(array('root'=>'Yellow'));//delete_tree_all(array('root'=>'Meat'));//delete_tree_item(array('root'=>'Meat'));//insert_tree('','','bigboss');//insert_tree(array('root'=>'Red'),'','dalao');//insert_tree(array('root'=>'Red'),array('root'=>'Cherry'),'baddalao');//insert_tree(array('root'=>'Fruit'),array('root'=>'Red'),'Redbother');display_tree(array('root'=>'Food'));

?

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

2

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.29

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

25

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

622

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP函数之array数组函数视频讲解
PHP函数之array数组函数视频讲解

共76课时 | 26万人学习

SQL 教程
SQL 教程

共61课时 | 3.6万人学习

SQL优化与排查(MySQL版)
SQL优化与排查(MySQL版)

共26课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号