用PHP程式實現樹狀結構的兩種方法

來源:互聯網
上載者:User
程式   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);?>
  



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.