仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1457|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网页设计php:树形布局的算法 2

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:53:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
到现在,对排版还是不很熟练,经常会排不好。     1 Food 18
  |
  +---------------------------------------+
  | |
  2 Fruit 11 12 Meat 17
  | |
  +------------------------+ +---------------------+
  | | | |
  3 Red 6 7 Yellow 10 13 Beef 14 15 Pork 16
  | |
  4 Cherry 5 8 Banana 9
   
  如许全部树状布局可以经由过程摆布值来存储到数据库中。持续之前,咱们看一看上面收拾整顿过的数据表。
   
   
  +-----------------------+-----+-----+
  | parent | name | lft | rgt |
  +-----------------------+-----+-----+
  | | Food | 1 | 18 |
  | Food | Fruit | 2 | 11 |
  | Fruit | Red | 3 | 6 |
  | Red | Cherry | 4 | 5 |
  | Fruit | Yellow | 7 | 10 |
  | Yellow | Banana | 8 | 9 |
  | Food | Meat | 12 | 17 |
  | Meat | Beef | 13 | 14 |
  | Meat | Pork | 15 | 16 |
  +-----------------------+-----+-----+
  注重:因为"left"和"right"在 SQL中有特别的意义,所以咱们需求用"lft"和"rgt"来暗示摆布字段。 别的这类布局中不再需求"parent"字段来暗示树状布局。也就是 说上面如许的表布局就足够了。
   
  +------------+-----+-----+
  | name | lft | rgt |
  +------------+-----+-----+
  | Food | 1 | 18 |
  | Fruit | 2 | 11 |
  | Red | 3 | 6 |
  | Cherry | 4 | 5 |
  | Yellow | 7 | 10 |
  | Banana | 8 | 9 |
  | Meat | 12 | 17 |
  | Beef | 13 | 14 |
  | Pork | 15 | 16 |
  +------------+-----+-----+
  好了咱们如今可以从数据库中获得数据了,例如咱们需求失掉"Fruit"项下的一切一切节点就能够如许写查询语句: SELECT * FROM tree WHERE lft BETWEEN 2 AND 11; 这个查询失掉了以下的了局。
   
   
  +------------+-----+-----+
  | name | lft | rgt |
  +------------+-----+-----+
  | Fruit | 2 | 11 |
  | Red | 3 | 6 |
  | Cherry | 4 | 5 |
  | Yellow | 7 | 10 |
  | Banana | 8 | 9 |
  +------------+-----+-----+
  看到了吧,只需一个查询就能够失掉一切这些节点。为了可以像下面的递归函数那样显示全部树状布局,咱们还需求对如许的查询停止排序。用节点的左值停止排序:
   
  SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;
  剩下的成绩若何显示层级的缩进了。
   
  <?php
  function display_tree($root)
  {
  // 失掉根节点的摆布值
  $result = mysql_query('SELECT lft, rgt FROM tree '.'WHERE name="'.$root.'";');
  $row = mysql_fetch_array($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_array($result))
  {
  // only check stack if there is one
  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'];
  }
  }
  ?>
  假如你运转一下以上的函数就会失掉和递归函数一样的了局。只是咱们的这个新的函数能够会更快一些,由于只要2次数据库查询。 要获知一个节点的途径就更复杂了,假如咱们想晓得Cherry 的途径就使用它的摆布值4和5来做一个查询。
   
  SELECT name FROM tree WHERE lft < 4 AND rgt > 5 ORDER BY lft ASC;
  如许就会失掉以下的了局:
   
  +------------+
  | name |
  +------------+
  | Food |
  | Fruit |
  | Red |
  +------------+
  那末某个节点究竟有几何子孙节点呢?很复杂,子孙总数=(右值-左值-1)/2 descendants = (right C left - 1) / 2 不信任?本人算一算啦。用这个复杂的公式,咱们可以很快的算出"Fruit 2-11"节点有4个子孙节点,而"Banana 8-9"节点没有子孙节点,也就是说它不是一个父节点了。
  很奇异吧?固然我已屡次用过这个办法,然而每次如许做的时分仍是感应很奇异。
   
  这切实其实是个很好的举措,然而有甚么举措可以帮咱们创立如许有摆布值的数据表呢?这里再引见一个函数给人人,这个函数可以将name和parent布局的表主动转换成带有摆布值的数据表。
   
   
  <?php
  function rebuild_tree($parent, $left) {
  // the right value of this node is the left value + 1
  $right = $left+1;
   
  // get all children of this node
  $result = mysql_query('SELECT name FROM tree '.
  'WHERE parent="'.$parent.'";');
  while ($row = mysql_fetch_array($result)) {
  // recursive execution of this function for each
  // child of this node
  // $right is the current right value, which is
  // incremented by the rebuild_tree function
  $right = rebuild_tree($row['name'], $right);
  }
   
  // we've got the left value, and now that we've processed
  // the children of this node we also know the right value
  mysql_query('UPDATE tree SET lft='.$left.', rgt='.
  $right.' WHERE name="'.$parent.'";');
   
  // return the right value of this node + 1
  return $right+1;
  }
  ?>
  固然这个函数是一个递归函数,咱们需求从根节点入手下手运转这个函数来重建一个带有摆布值的树
   
  rebuild_tree('Food',1);
  这个函数看上去有些庞杂,然而它的感化和手工对表停止编号一样,就是将平面多层布局的转换成一个带有摆布值的数据表。

PHP的理解是新手最难迈过的一道门槛,不过你应该感到幸运的是PHP已经最大极限的为了新手而努力了,如果你学过其他的语言,也许会觉得PHP的确相当的简单,但是如果你之前什么都没学过,那么阿弥陀佛,硬着头皮琢磨吧。
兰色精灵 该用户已被删除
沙发
发表于 2015-2-4 06:50:27 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
精灵巫婆 该用户已被删除
板凳
发表于 2015-2-8 19:56:36 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
小魔女 该用户已被删除
地板
发表于 2015-2-25 20:54:30 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
爱飞 该用户已被删除
5#
 楼主| 发表于 2015-3-7 22:27:04 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
飘灵儿 该用户已被删除
6#
发表于 2015-3-19 05:19:01 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-20 01:09:18 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
柔情似水 该用户已被删除
8#
发表于 2015-3-27 09:41:03 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
灵魂腐蚀 该用户已被删除
9#
发表于 2015-3-27 19:10:42 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
金色的骷髅 该用户已被删除
10#
发表于 2015-4-4 03:41:31 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
分手快乐 该用户已被删除
11#
发表于 2015-4-5 00:31:44 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
不帅 该用户已被删除
12#
发表于 2015-4-16 18:04:32 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
因胸联盟 该用户已被删除
13#
发表于 2015-4-17 08:38:23 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
透明 该用户已被删除
14#
发表于 2015-5-1 10:11:40 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
谁可相欹 该用户已被删除
15#
发表于 2015-5-6 06:10:46 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
老尸 该用户已被删除
16#
发表于 2015-6-11 16:35:59 | 只看该作者
实践是检验自己会不会的真理。
变相怪杰 该用户已被删除
17#
发表于 2015-6-13 01:03:44 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
18#
发表于 2015-6-27 07:23:09 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
愤怒的大鸟 该用户已被删除
19#
发表于 2015-7-1 06:47:06 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表