ホームページ  >  記事  >  バックエンド開発  >  ツリー構造を実装する 2 つの方法_PHP チュートリアル

ツリー構造を実装する 2 つの方法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 16:08:35998ブラウズ


ツリー構造を実装する 2 つの方法 1.再帰メソッド
再帰とは、関数内でそれ自体を明示的に呼び出すことを意味します。
再帰的手法を使用してツリー構造を実現すると、データの書き込み速度が速くなり、表示速度が遅くなるという特徴があります (特にツリーに多くの分岐/レベルがある場合に顕著です)。書き込むデータ量が多く、ツリー構造が複雑な場合に適しています。
データ構造 (mysql を例にします)

コード:------------------------------------- ---------------------------------------------------- --------
CREATE TABLE `tree1` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL デフォルト '0',
`topic` varchar (50) デフォルト NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`)
) TYPE=MyISAM;

INSERT INTO `tree1` (`id`, `parentid`, `topic` ) 値
(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、レコード番号
parentid、レコードの親レコードID(0の場合はルートレコード)
topic、レコードの表示タイトル

表示プログラム

シーケンスツリー:

PHPコード:----------------------- ------------------------ -------------------------- ------------------

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

/* ツリー表示 再帰関数 */
functiontree($parentid = 0) {
/* SQLクエリを実行してタイトルとレコードの ID*/
$sql = "select topic,id fromtree1 whereparentid = $parentid order by id asc ";
$rs = mysql_query($sql);
/* Indent*/
echo("< ul>");
while($ra = mysql_fetch_row($rs)) {
/* レコードタイトルを表示* /
echo ('& lt; li & gt;'. $ Ra [0]. '& Lt;/ li & gt;');
/* 再帰呼び出し */
ツリー ($ ra [1]);/ul>");
}
?>

----- ------------------------- ------------------------ -------------------------


逆順ツリー:

PHP コード:----------- ---------------------------------- ---------------- ------------------------

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

/* ツリー表示用の再帰関数*/
function Tree($parentid = 0) {
/* SQL クエリを実行してレコード ID のタイトルとレコードを取得*/
$sql = "select topic,id fromtree1 where parentid = $parentid order by id desc";
$rs = mysql_query($sql);
/* Indent*/
echo("

    ");
    while($ra = mysql_fetch_row($rs)) {
    /* レコードのタイトルを表示*/
    echo('
  • '.$ra[0].'
  • ');
    /* 再帰呼び出し*/
    tree($ra[1]);
    }
    echo("
");
}
tree();
?>

------ ----------------- --------------------------------- --------------- ------


データプログラム

PHPコードを挿入:---------------- --------------- --------------------------------- --------------

< ;?
/* データベース接続*/
mysql_connect();
mysql_select_db('tree');
$sql = "ツリー (トピック、親 ID) 値に挿入 ('ツリー 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 デフォルト '0',
`rootid` tinyint(3) unsigned NOT NULL デフォルト '0',
`layer` tinyint(3) unsigned NOT NULL デフォルト '0',
`orders` tinyint(3) unsigned NOT NULL デフォルト '0',
`topic` varchar( 50) デフォルト NULL、
PRIMARY KEY (`id`)、
KEY `parentid` (`parentid`)、
KEY `rootid` (`rootid`)
) TYPE=MyISAM

INSERT INTO `tree2` (`id `、`parentid`、`rootid`、`layer`、`orders`、`topic`) 値
(1,0,1,0,0,'Tree 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 from Tree2 where rootid = $ra[0] order by order";
      $rs1 = mysql_query($sql);
      while($ra1 = mysql_fetch_row($ rs1)){
      /* indent display* /
      lay){
      使用して - s ’sを介してs’ sを使用して使用して使用します。 & gt; $ ra1 [0] & lt;/li & gt; ");
      $lay = $ ra1 [1];}} (" & lt;/ul & gt; ");
      }
      echo("
    ");
    ?>

    --------------------------------- -- ------------------------------------------------


    データプログラムの挿入

    PHPコード:----------------------------------------------------- ---------- --------------------------------------

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

    /* ルートレコードを挿入*/
    $sql = "ツリー 2 (トピック) の値に挿入 ('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 fromtree2 where id = $parentid";
    list ($rootid,$layer,$orders) = mysql_fetch_row(mysql_query($sql));
    /* 位置を挿入した後に記録された注文値を更新します*/
    $sql = "updatetree2 setorders =orders + 1 whereorders > ; $orders";
    mysql_query($sql) ;
    /* レコードを挿入*/
    $sql = "tree2 (rootid,parentid,orders,layer,topic) の値 ($rootid,$parentid,") に挿入します。 ($orders+1).",".($layer+1).",'ツリー 2-1-1-2')";
    mysql_query($sql);?>



    http://www.bkjia.com/PHPjc/314792.html

    www.bkjia.com

    tru​​e

    http://www.bkjia.com/PHPjc/314792.html

    ツリー構造を実装する 2 つの方法 1.再帰的メソッド 再帰とは、関数内でそれ自体を明示的に呼び出すことを指します。 再帰的手法を用いてツリー構造を実現する特徴は、データの書き込み速度と表示速度が速いことです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。