ホームページ >php教程 >php手册 >PHP プログラムを使用してツリー構造を実装する 2 つの方法

PHP プログラムを使用してツリー構造を実装する 2 つの方法

WBOY
WBOYオリジナル
2016-06-21 08:58:221188ブラウズ

程序

  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("

    ");
      while($ra = mysql_fetch_row($rs)) {
      /* 显示记录标题 */
      echo('
  • '.$ra[0].'
  • ');
      /* 递归调用 */
      tree($ra[1]);
      }
      echo("
");
  }
  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("

    ");
      while($ra = mysql_fetch_row($rs)) {
      /* 显示记录标题 */
      echo('
  • '.$ra[0].'
  • ');
      /* 递归调用 */
      tree($ra[1]);
      }
      echo("
");
  }
  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 whereparentid = 0 order by id desc";
$rs = mysql_query($sql);
echo("

    ");
    $lay = 0;
    while($ra = mysql_fetch_row($rs)) {
    echo ("
      ");
      /* このツリー内のすべてのレコードを選択し、順序フィールドで並べ替えます */
      $sql = "select topic,layer fromtree2 where

      rootid = $ ra[0] order byorder";
      $rs1 = mysql_query($sql);
      while($ra1 = mysql_fetch_row($rs1)) {
      /* インデント表示 */
      if( $ra1[1]>$lay) {
      echo(str_repeat("

        ",$ra1[1]-$lay));
        }elseif($ra1[1] <$ lay) {
        echo(str_repeat("
      ",$lay-$ra1[1]));
      }
      /* レコード表示 */
      // echo(" $ra1[1]>$lay");
      echo("
    • $ra1[0]
    • ");
      $lay = $ra1[1];
      }
      echo("
    ");
    }
    echo("
");
?>

データ挿入プログラム

PHP:

/* データベース接続 */
mysql_connect();
mysql_select_db('tree');

/* 挿入root Record */
$sql = "tree2 (トピック) 値に挿入 ('tree5')";
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));
/* 位置の挿入後に記録された注文値を更新します */
$sql = "update Tree2 setorders =orders + 1 whereorders > $ order" ;
mysql_query($sql);
/* レコードを挿入 */
$sql = "tree2 (rootid,parentid,orders,

layer,topic) 値に挿入($rootid ,$parentid,".($orders+1).",".($layer+1).",'tree2-1-1-2')";
mysql_query($sql) ;?> ;



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。