php不用递归完成无限分类,从表设计入手完整演示过程
无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图
网上无限分类大多不全面,今天我会从设计表开始,
首先我们先做视图界面,
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>白超华-博客园</title>
- </head>
- <body>
- <form action="" method="post">
- 分类名称 <input type="text" name="cat_name" value=""><br><br>
- 上级分类 <select name="cat_root">
- <option value="">顶级分类</option>
- </select>
- <input type="submit">
- </form>
- </body>
- </html>
网页展示如下:
我们首先来设计表,(需要实验的朋友直接复制SQL语句到cmd执行即可)
- #创建数据库
- CREATE DATABASE tree;
- #选择数据库
- USE tree;
- #创建表
- CREATE TABLE tree(
- cat_id smallint UNSIGNED AUTO_INCREMENT comment '类别ID',
- cat_name varchar() NOT NULL comment '类别名称',
- parent_id smallint NOT NULL DEFAULT comment '类别父ID',
- path varchar() NOT NULL comment '路劲结构',
- PRIMARY KEY(cat_id)
- )engine=MyISAM charset=utf8;
表结构如下:
其中字段 path 就是不用递归操作的重点,path用来表示下级分类深入的情况,啊哈用语言还不是很好描述,举个简单例子吧,理解的朋友就直接跳过了!
path是通过字符串存储的形式来表示类别之间的层关系,通过字符串函数我们可以知道path中 ' - ' 的数量,如果有一个表示它上面有一个父分类,
如果有两个表示它上面有两个父分类.以此类推实现无限分类。
通过表单获取的类别id和父id可以得到路径path,我们需要写一个函数来获取path,就是先插入这条数据,然后根据这条数据的id,pid制作除path然后更新到这条记录,
不使用递归的方法就是在插入path的时候需要制作一个path路径。
php代码如下:
- <?php
- header("Content-Type:text/html;charset=utf8");
- require './Mysql.class.php';//引入数据库操作类
- $db = new Mysql(); //连接数据库
- //从数据表中获取数据用来显示到 select 下拉菜单.
- $sql = "SELECT * FROM tree";
- $result = $db->getAll($sql);
- //接受表单数据
- if(!empty($_POST['cat_name'])){
- $cat_name = trim($_POST['cat_name']);
- $parent_id = isset($_POST['parent_cat']) ? $_POST['parent_cat'] : ;
- $sql2 = "SELECT cat_id FROM tree WHERE parent_id = $parent_id";
- $cat_id = $db->getOne($sql2);
- $path = path($parent_id,$cat_id);
- //数据入库
- $sql = "INSERT INTO tree (cat_name,parent_id,path) values('$cat_name',$parent_id,$path)";
- if($db->query($sql)) echo "插入成功";
- foreach($result as $row){
- $sun = substr_count($row['path'], '-');
- if($num > ){
- $pre = str_repeat('-',$sum);
- }else {
- $row['tree'] = $pre.$row['name'];
- }
- $str.=$row['tree'].'br';
- }
- echo $str;
- }
- include './tree.html'; //引入视图文件
可以自己定义输出样式
php不用递归完成无限分类,从表设计入手完整演示过程的更多相关文章
- TreeView递归绑定无限分类数据
TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...
- php递归获取无限分类菜单
从数据库获取所有菜单信息,需要根据id,pid字段获取主菜单及其子菜单,以及子菜单下的子菜单,可以通过函数递归来实现. <?php class Menu { public $menu = arr ...
- PHP不使用递归的无限级分类
不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点 代码: <?php $list = array( array('id'=>1, 'pid'= ...
- 后台树状菜单,js实现递归无限分类
//新闻类别管理 public function new_classify() { $arr = M('news_classify')->where("fid = 0")-& ...
- Think PHP递归重新排序无限极子分类数组(递归无限极分类)
Think PHP递归重新排序无限极子分类数组 // 递归重新排序无限极子分类数组 function recursive($array,$pid=0,$level=0){ $arr = array() ...
- php不使用递归实现无限极分类
无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...
- php递归无限分类、根据子类获取所有顶类
//递归无限分类树 public static function diGui($data, $pid) { $arr = collect([]); if (empty($data)) { return ...
- PHP在无限分类时注意的一些问题(不保证代码完全正确哦)
转自:PHP在无限分类时注意的一些问题(http://lxiaoke.cn) (注意:代码使用的是原生PHP,旨在提供解决思路)1 无限分类的查找(获取所有节点) 代码: /** * 无限分类查询,默 ...
- MySql无限分类数据结构--预排序遍历树算法
MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...
随机推荐
- 配置Maven从私服下载构件
--------------------siwuxie095 配置 Maven 从私服下载构件 从 Nexus ...
- SqlServer 查询死锁,杀死死锁进程*转载
原文: -- 查询死锁 select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName fro ...
- swift - 代码创建 pickerView 显示或隐藏横线
import UIKit class VC1: UIViewController { fileprivate lazy var pickerV : UIPickerView = { let v = U ...
- 14-matlab排序
冒泡和选择: clc; clear; n = 10; %输入数据的个数 suct = 0; %素数的个数 unsuct = 0;%非素数的个数 % a = [33 34 2 34 24 56 3 17 ...
- 【原创】有关Silverlight中 "Silverlight提示4004错误" 的解决方案及思路。
今天下午再改一个页面xaml时没注意一个细节导致了这个错误,整整搞了1个小时.在这给大家参考参考. 出错原因: 总结:其实silverlight已经提示了 出错的细节信息了,没必要因为silverli ...
- 测试rar/bz2/tar.gz/gz压缩文档完整性
#gz文件gzip -t *.gz#bz2文件tar jtvf archive.tar.bz2#tar.gz文件tar jtvf archive.tar.gz#rar文件unrar t 1.rar
- loadrunner12.5-添加检查点
1.点击缩略图资源管理器,找到需要添加检查点的页面. 2.选中需要添加检查点的页面,切换到快照tab,选择“树”型显示方式. 3.在响应窗口下,找到需要添加的检查点的内容,选中--右键--添加文本检查 ...
- 一定要 先删除 sc表 中的 某元组 行,,, 再删除 course表中的 元组行
一定要 先删除 sc表 中的 某元组 行,,, 再删除 course表中的 元组行 course表 SC表 删除 course表中的 元组行,,出现错误 sc ---->参 ...
- mvc模拟实现
.定义httpmodule <system.webServer> <modules> <add name="UrlRoutingModule" typ ...
- action spring 注入错误,如果检查各项注入都没有错误时,考虑struts 是否配置了namespace(如果你有多个namespace="/")
[ERROR] 2015-01-04 09:42:35,180 (CommonsLogger.java:38) - Exception occurred during processing reque ...