仓酷云

标题: PHP网站制作之用PHP法式完成树状布局的两种办法 [打印本页]

作者: 不帅    时间: 2015-2-3 23:54
标题: PHP网站制作之用PHP法式完成树状布局的两种办法
大家如果能懂得“熟能生巧”的道理也就明白了这并不是浪费时间,同时这也可以减轻板主的负担,让他们有时间去处理更难的问题。法式     1.递归法
  递归是指在函数中显式的挪用它本身。
  使用递归法完成树状布局的特色是写入数据速度较快,显示速度较慢(在树的分支/条理较多的情形下特别分明)。合用与写入数据量大,树的布局庞杂的情形下。
  数据布局(以mysql为例)   代码:
  CREATE TABLE `tree1` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `parentid` tinyint(3) unsigned NOT NULL default '0',
  `topic` varchar(50) default NULL,
  PRIMARY KEY (`id`),
  KEY `parentid` (`parentid`)
  ) TYPE=MyISAM;
  INSERT INTO `tree1` (`id`, `parentid`, `topic`) valueS
  (1,0,'树1'),
  (2,0,'树2'),
  (3,0,'树3'),
  (4,2,'树2-1'),
  (5,4,'树2-1-1'),
  (6,2,'树2-2'),
  (7,1,'树1-1'),
  (8,1,'树1-2'),
  (9,1,'树1-3'),
  (10,8,'树1-2-1'),
  (11,7,'树1-1-1'),
  (12,11,'树1-1-1-1');
  
  字段申明
  id,纪录的id号
  parentid,纪录的父纪录id(为0则为根纪录)
  topic,纪录的显示题目
  显示法式
  按次树:
  PHP:
  <?
  /* 数据库毗连 */
  mysql_connect();
  mysql_select_db('tree');
  /* 树状显示的递归函数 */
  function tree($parentid = 0) {
  /*履行sql查询,获得纪录的题目和id*/
  $sql = "select topic,id from tree1 where
parentid = $parentid order by id asc";
  $rs = mysql_query($sql);
  /* 缩进*/
  echo("<ul>");
  while($ra = mysql_fetch_row($rs)) {
  /* 显示纪录题目 */
  echo('<li>'.$ra[0].'</li>');
  /* 递归挪用 */
  tree($ra[1]);
  }
  echo("</ul>");
  }
  tree();
  ?>
  逆序树:
  PHP:
  <?
  /* 数据库毗连 */
  mysql_connect();
  mysql_select_db('tree');
  /* 树状显示的递归函数 */
  function tree($parentid = 0) {
  /*履行sql查询,获得纪录的题目和id*/
  $sql = "select topic,id from tree1 where parentid
= $parentid order by id desc";
  $rs = mysql_query($sql);
  /* 缩进*/
  echo("<ul>");
  while($ra = mysql_fetch_row($rs)) {
  /* 显示纪录题目 */
  echo('<li>'.$ra[0].'</li>');
  /* 递归挪用 */
  tree($ra[1]);
  }
  echo("</ul>");
  }
  tree();
  ?>
  拔出数据法式
  PHP:
  <?
  /* 数据库毗连 */
  mysql_connect();
  mysql_select_db('tree');
  $sql = "insert into tree (topic,parentid) values('树3-1',3);";
  mysql_query($sql);
  ?>
  2.排序字段法
  此办法是经由过程在数据布局中增添一个标记纪录在全部树中的按次地位的字段来完成的。特色是显示速度和效力高。但在单个树的布局庞杂的情形下,数据写入效力有所缺乏。并且按次分列时分,拔出,删除纪录的算法过于庞杂,故凡是用逆序分列。
  数据布局(以mysql为例)
  代码:
  CREATE TABLE `tree2` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `parentid` tinyint(3) unsigned NOT NULL default '0',
  `rootid` tinyint(3) unsigned NOT NULL default '0',
  `layer` tinyint(3) unsigned NOT NULL default '0',
  `orders` tinyint(3) unsigned NOT NULL default '0',
  `topic` varchar(50) default NULL,
  PRIMARY KEY (`id`),
  KEY `parentid` (`parentid`),
  KEY `rootid` (`rootid`)
  ) TYPE=MyISAM
  INSERT INTO `tree2` (`id`, `parentid`, `rootid`,
`layer`, `orders`, `topic`) valueS
  (1,0,1,0,0,'树1'),
  (2,0,2,0,0,'树2'),
  (3,0,3,0,0,'树3'),
  (4,2,2,1,2,'树2-1'),
  (5,4,2,2,3,'树2-1-1'),
  (6,2,2,1,1,'树2-2'),
  (7,1,1,1,4,'树1-1'),
  (8,1,1,1,2,'树1-2'),
  (9,1,1,1,1,'树1-3'),
  (10,8,1,2,3,'树1-2-1'),
  (11,7,1,2,5,'树1-1-1'),
  (12,11,1,3,6,'树1-1-1-1');
  
  显示法式
  PHP:
  <?
  /* 数据库毗连 */
  mysql_connect();
  mysql_select_db('tree');
  /* 选出一切根纪录id */
  $sql = "select id from tree2 where parentid = 0 order by id desc";
  $rs = mysql_query($sql);
  echo("<ul>");
  $lay = 0;
  while($ra = mysql_fetch_row($rs)) {
  echo("<ul>");
  /* 选出此树一切纪录,并按orders字段排序 */
  $sql = "select topic,layer from tree2 where
rootid = $ra[0] order by orders";
  $rs1 = mysql_query($sql);
  while($ra1 = mysql_fetch_row($rs1)) {
  /* 缩进显示 */
  if($ra1[1]>$lay) {
  echo(str_repeat("<ul>",$ra1[1]-$lay));
  }elseif($ra1[1]<$lay) {
  echo(str_repeat("</ul>",$lay-$ra1[1]));
  }
  /* 纪录显示 */
  //echo("$ra1[1]>$lay");
  echo("<li>$ra1[0]</li>");
  $lay = $ra1[1];
  }
  echo("</ul>");
  }
  echo("</ul>");
  ?>
  拔出数据法式
  PHP:
  <?
  /* 数据库毗连 */
  mysql_connect();
  mysql_select_db('tree');
  /* 拔出根纪录 */
  $sql = "insert into tree2 (topic) values ('树5')";
  mysql_query($sql);
  $sql = "update tree2 set rootid = id where id = ".mysql_insert_id();
  mysql_query($sql);
  /* 拔出子纪录 */
  $parentid = 5;//父纪录id
  /* 掏出 根纪录id,父纪录缩进条理,父纪录按次地位 */
  $sql = "select rootid,layer,orders from tree2 where id = $parentid";
  list($rootid,$layer,$orders) = mysql_fetch_row(mysql_query($sql));
  /* 更新拔出地位跋文录的orders值 */
  $sql = "update tree2 set orders = orders + 1 where orders > $orders";
  mysql_query($sql);
  /* 拔出纪录 */
  $sql = "insert into tree2 (rootid,parentid,orders,
layer,topic) values ($rootid,$parentid,".($orders+1).",".($layer+1).",'树2-1-1-2')";
  mysql_query($sql);?>
  
理解网站这一概念之后不难看出,任何网站都是由网页组成的,也就是说想完成网站,必须先学会做网页,因此必须要掌握了HTML,才能为今后制作网站打下基础。
作者: 第二个灵魂    时间: 2015-2-4 06:58
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 兰色精灵    时间: 2015-2-9 18:15
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 变相怪杰    时间: 2015-2-27 15:32
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 山那边是海    时间: 2015-3-9 08:08
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 不帅    时间: 2015-3-11 00:17
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 乐观    时间: 2015-3-15 21:46
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 蒙在股里    时间: 2015-3-20 07:15
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: 老尸    时间: 2015-4-1 22:08
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
作者: 深爱那片海    时间: 2015-4-9 02:09
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 莫相离    时间: 2015-4-11 09:15
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 飘灵儿    时间: 2015-4-16 11:11
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 透明    时间: 2015-4-16 18:10
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 若相依    时间: 2015-4-19 10:46
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 简单生活    时间: 2015-4-21 23:12
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 精灵巫婆    时间: 2015-4-22 11:07
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者: 再见西城    时间: 2015-5-7 02:06
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
作者: 愤怒的大鸟    时间: 2015-5-7 12:27
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
作者: 分手快乐    时间: 2015-5-9 16:05
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
作者: admin    时间: 2015-6-12 22:27
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 若天明    时间: 2015-6-19 06:12
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2