ツリー構造を実装する 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
true
http://www.bkjia.com/PHPjc/314792.html
技術記事ツリー構造を実装する 2 つの方法 1.再帰的メソッド 再帰とは、関数内でそれ自体を明示的に呼び出すことを指します。 再帰的手法を用いてツリー構造を実現する特徴は、データの書き込み速度と表示速度が速いことです...