(注意:代码使用的是原生PHP,旨在提供解决思路)
1 无限分类的查找(获取所有节点)

代码:

  1. /**
  2. * 无限分类查询,默认 pid 为 0
  3. * @param $pid
  4. * @return array $res
  5. */
  6. protected function selectTree($pid = 0)
  7. {
  8. $res = [];
  9. $sql = "SELECT * FROM " . $this->tbname . " WHERE pid=" . $pid;
  10. $result = @mysqli_query($this->link, $sql);
  11. if ($result) {
  12. $count = mysqli_num_rows($result);
  13. if ($count > 0) {
  14. while ($rows = mysqli_fetch_assoc($result)) {
  15. $rows['children'] = $this->selectTree($rows['id']);
  16. $res[] = $rows;
  17. }
  18. }
  19. mysqli_free_result($result);
  20. }
  21. return $res;
  22. }

2 无限分类节点的删除,不能单纯地删除当前节点,需要查找到当前节点下的所有子节点,一并删除

代码:

  1. /**
  2. * 删除目录树
  3. * @param $id
  4. */
  5. protected function deleteTree($id)
  6. {
  7. $res = $this->selectTree($id);
  8. if (!empty($res)) {
  9. foreach ($res as $v) {
  10. $this->deleteTree($v['id']);
  11. }
  12. }
  13. $sql = "DELETE FROM " . $this->tbname . " WHERE id=" . $id;
  14. mysqli_query($this->link, $sql);
  15. }

3 **无限分类的编辑,由于在编辑的时候其父级是可选择的,所以有可能造成用户选择到当前节点的子节点(们),所以要进行判断。虽说是无限分类,但正常情况下目录深度是会有限度的,如果给定了目录深度,还要判断选择父级之后的目录深度是否超出范围。

如果将编辑的元素放在其子元素下,所造成的问题:在查询的时候无限循环!!

id

pid

name

1

0

test1

2

1

test2

修改之后:

id

pid

name

1

2

test1

2

1

test2

如上表所示,在进行无限分类查询时,就会陷入死循环!

所以,针对可能会出现的问题,给出下面的解决办法,在用户修改时进行判断,通过则可以修改,未通过则给出提示。

3.1 判断用户选择的是否是当前节点(这个只需要判断选择的节点和当前编辑节点的ID是否相同即可)

3.2 判断用户选择的是否是子节点(如果是的话返回true)

  1. /**
  2. * 判断id所对应的元素是否是pid所对应元素的子元素,是的话返回true
  3. * @param $id
  4. * @param $pid
  5. * @return boolean $result
  6. */
  7. protected function isChild($id, $pid)
  8. {
  9. $result = false;
  10. $sql = "SELECT pid FROM " . $this->tbname . " WHERE id=" . $id;
  11. $res = @mysqli_query($this->link, $sql);
  12. if ($res) {
  13. while ($rows = mysqli_fetch_assoc($res)) {
  14. $result = ($pid === $rows['pid']) ? true : (($rows['pid'] !== 0) ? $this->isChild($rows['pid'], $pid) : false);
  15. }
  16. }
  17. return $result;
  18. }

3.3 判断用户选择的节点是否已经达到目录深度

在做完后面的一步之后,这一步就比较好实现了:

  1. /**
  2. * 判断所选元素是否达到目录深度,达到返回true
  3. * @param $id
  4. * @return mixed
  5. */
  6. protected function isMaxDeep($id)
  7. {
  8. return $this->deepUp($id) >= $this->maxDeep;
  9. }

3.4 判断修改之后的目录深度是否超出限定范围

  1. /**
  2. * 修改之后的最终深度,如果深度大于规定深度,返回true
  3. * @param $pid
  4. * @param $id
  5. * @return mixed
  6. */
  7. protected function lastDeep($pid, $id)
  8. {
  9. return ($this->deepUp($pid) + $this->deepDown($id)) > $this->maxDeep;
  10. }
  11.  
  12. /**
  13. * 向上查找父元素的深度
  14. * @param $id
  15. * @param int $k
  16. * @return int
  17. */
  18. protected function deepUp($id, $k = 1)
  19. {
  20. $sql = "SELECT pid FROM " . $this->tbname . "WHERE id=" . $id;
  21. $res = @mysqli_query($this->link, $sql);
  22. if ($res) {
  23. while ($rows = mysqli_fetch_assoc($res)) {
  24. ($rows['pid'] !== 0) && $k = $this->deepUp($rows['pid'], $k+1);
  25. }
  26. }
  27. return $k;
  28. }
  29.  
  30. /**
  31. * 向下查找子元素的深度
  32. * @param $id
  33. * @param int $k
  34. * @return int
  35. */
  36. protected function deepDown($id, $k = 0)
  37. {
  38. $sql = "SELECT * FROM " . $this->tbname . "WHERE pid=" . $id;
  39. $res = @mysqli_query($this->link, $sql);
  40. if ($res && mysqli_num_rows($res) > 0) {
  41. $k++;
  42. while ($rows = mysqli_fetch_assoc($res)) {
  43. $k = max($k, $this->deepDown($rows['id'], $k))
  44. }
  45. }
  46. return $k;
  47. }

经过上面的判断之后,根据返回的结果就能判断是否可以修改,如果返回true,则不可以修改,如果是false则可以进行修改。

(如果不用无限分类查询,只是普通的查询,让前端去实现结果的显示会怎么样呢??不懂那些框架是怎么实现的,感觉也是在用递归)

PHP在无限分类时注意的一些问题(不保证代码完全正确哦)的更多相关文章

  1. MySql无限分类数据结构--预排序遍历树算法

    MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...

  2. TreeView递归绑定无限分类数据

    TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...

  3. PHP全路径无限分类原理

    全路径无限分类:以一个字段把他所有的父级id按顺序记录下来以此实现的无限分类叫做全路径无限分类 优点:查询方便 缺点:增加,移动分类时数据维护时稍微复杂.

  4. PHP实现无限分类

    PHP实现无限分类 无限分类 递归 无限级分类是一种设计技巧,在开发中经常使用,例如:网站目录.部门结构.文章分类.笔者觉得它在对于设计表的层级结构上面发挥很大的作用,比如大家在一些平台上面,填写邀请 ...

  5. laravel-nestedset:多级无限分类正确姿势

    laravel-nestedset:多级无限分类正确姿势   laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安 ...

  6. 后台树状菜单,js实现递归无限分类

    //新闻类别管理 public function new_classify() { $arr = M('news_classify')->where("fid = 0")-& ...

  7. 关于无限分类的树状输出(id,name,pid)类型的

    首先创建无限分类的数据表,我这里采用的是id.name.pid这种类型(当然还有很多种无限分类的方式了,比如:id.name.pid.path.left.right左右节点的形式) CREATE TA ...

  8. php递归方法实现无限分类实例

    数组:  代码如下 复制代码 $items = array( array('id' => 1, 'pid' => 0, 'name' => '一级11' ), array('id' ...

  9. PHP+Mysql无限分类的方法汇总

    无限分类是个老话题了,来看看PHP结合Mysql如何实现.第一种方法这种方法是很常见.很传统的一种,先看表结构表:categoryid int 主键,自增name varchar 分类名称pid in ...

随机推荐

  1. python输出带颜色字体

    方法1: (参考https://suixinblog.cn/2019/01/print-colorful.html) 使用Python中自带的print输出带有颜色或者背景的字符串 书写语法 prin ...

  2. 搜索法 | 1103 dfs搜索:符合条件的多项式

    其实这题我已经写过两遍了,但都是在看过算法笔记的情况下写的.方法不难,只要能想出来. 找到一个项数为k,每项为p次幂,和为n,并且在有多个结果的情况下要求数字之和最大的一个多项式.如果数字之和相等.还 ...

  3. 洛谷 P2580 【于是他错误的点名开始了】题解

    XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). 题目背景 ...

  4. About Her

    突然想给黑寡妇写点儿东西......(也许很多都不是我写的,但是能表达我的心意) 1. 众人进量子领域前最后一句话是她笑着说"一分钟后见." 而最终没有回来的,只有她自己一个 2. ...

  5. xcode: {} 花括号缩进一个空格

    if (jsonDict.HasParseError()) { //前面总是有一个空格 CCLOG("GetParseError %d\n",jsonDict.GetParseEr ...

  6. [Usaco2012 Feb] Cow Coupons

    [Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...

  7. 计算机原理学习(1)-- 冯诺依曼体系和CPU工作原理

    前言 对于我们80后来说,最早接触计算机应该是在95年左右,那个时候最流行的一个词语是多媒体. 依旧记得当时在同学家看同学输入几个DOS命令就成功的打开了一个游戏,当时实在是佩服的五体投地.因为对我来 ...

  8. 关于“100g文件全是数组,取最大的100个数”解决方法汇总

    原题如下: 有一个100G大小的文件里存的全是数字,并且每个数字见用逗号隔开.现在在这一大堆数字中找出100个最大的数出来. 我认为,首先要摸清考官的意图.是想问你os方面的知识,还是算法,或者数据结 ...

  9. Mysql 查看连接数,状态 最大并发数,以及设置连接数

    show variables like '%max_connections%'; 查看最大连接数 set global max_connections=1000  重新设置最大连接数 set-vari ...

  10. MinGW g++.exe 编译 DLL 时,导出函数名带@的问题

    今天尝试用CodeBlocks写了一个简单的Dll,发现生成的 dll 文件导出的函数名后面都有一个 @xxx 从生成的 libDll2.def 中看到: EXPORTS DllMain@ @ Max ...