自分で書いた php 用の PHP ツリー型ツリーを投稿します
Infinitus 分類を行うときによくレジェンダリー データ構造ツリーが必要になります
ですが、検索した結果
が私に適したものを見つけることができないようです
今日
を書いて見せました
データベースのサポートを必要とする Infinitus ツリー クラス
友人が私にアドバイスや補足を与えてくれることを願っています。
----- - -------オープンソース宣言--------------
オープンソースが私たちにもたらすものは、共通の改善を達成するために
反復作業を削減することであるべきです
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> <?php /* PHPはデータ構造ツリークラスを実装します データベースのサポートが必要です。ファイルとメモリのデータ保存は現在サポートされていません。 バージョン:1.0 時期: 2010 年 4 月 1 日 著者: Unknown Tree Studio www.untree.net Liu Dingfa データベーステーブルの構造 CREATE TABLE `tree` ( `c_id` bigint(20) unsigned NOT NULL auto_increment、 `c_name` varchar(255) NOT NULL デフォルト ''none''、 `c_fid` bigint(20) 符号なしデフォルト '0'、 `c_data` varchar(255) デフォルトは NULL、 主キー (`c_id`) ) テーブル名はクラスコンストラクターで指定できます。 関数インデックス: 1. コンストラクター $mode のデフォルトは db です。他のモードは $name ツリー名をサポートしません。 $tb_file_name: テーブル名、ファイル モードはファイル名を使用します (一時的には使用できません)。 $db_data はデータベースパラメータです $db_set=配列( 'db_host'=>'localhost', 'db_user'=>'root', 'db_pass'=>'123456', 'db_name'=>'sy_speedphp' ); function __construct($mode='db',$name,$tb_file_name='tree',$db_data=NULL) 2. ノードの追加 // 挿入が成功すると挿入 ID が返されます $data はデータフィールドです 関数 addnode($fid=0,$data) 3. ノードの情報を変更するには、FID フィールドと DATA フィールドのみを変更します。 //指定しない場合。デフォルトでは変更されません 関数 mdfnode($node_id,$fid=false,$data=false) 4. ノードとそのサブノードを削除します。id はノード ID、mode は削除モード、true は直接削除、false は指定されたノードとサブノードを新しいツリーに移動し、ランダムな名前を返します。新しい木。 関数 deletenode($id,$mode=true) 5. 指定したルートノードを除く子ノード関数を取得し、その関数を再帰的に呼び出します 関数 getsub($fid,$deep=8888,$storage_mode=true,$recall=NULL) $fid はルート ノード ID です $deep: トラバーサルの深さは 1 から始まり、1 は子ノード、2 は孫ノードです $storage_mode=trueの場合、多次元配列を使用して親子関係を返します $storage_mode=false の場合、1 次元配列を使用して返し、親子関係を記録しません。 $recall コールバック関数 空でない場合、この関数はトラバーサル プロセス中にデータごとに呼び出されます。 コールバック関数は次のように定義されます。 function function_name($node_data,$deep); $node_data はノード データです。 deep は、ノードから指定されたルート ノード (fid) までの距離を示す、1 から始まる深さです。 コールバック関数のパラメータは次のように渡されます。 function myfunction($node_data,$deep){code};//カスタム関数 $tree1->gestb(0,8888,true,"myfunction")//関数名をパラメータとして使用 多次元配列として保存すると、構造は次のようになります。 配列 ( fid1=>array()、 fid2=>配列 ( fid21=>array(id,name,fid,data), fid22=>array(id,name,fid,data), ) $fid3=>データ; ) その中にはfid1、fid2……はルートノードのIDで、対応する値は子ノード情報です。 //注: リーフ ノードのみが特定のデータを返すことができます //$deep は深さです。デフォルトは -1 で、すべてを返すことを意味します。たとえば、deep=1 の場合、子ノードの最初の層が返されます。 6. ノード情報を取得し、ノード情報を返し、配列にキー値を sub_count=>子ノードの数として追加します。 関数 getnode(4); 7. //ルート上位カテゴリ情報を取得 関数 getfarlist($node_id,$fadeep) //@param:$fadeep 上層は前に近いデータから返します fadeep は 1 から始まり 2 次元配列を返します 8. クエリを送信します。insert update delete の場合は true または false のみを返します。SELECT の場合は 2 次元配列を返します。 関数 db_query($sql) 9. エラー メッセージ機能はカスタマイズおよび変更できます。現在、エラー メッセージのみが表示されます。 関数エラー($msg); */ // SQL ステートメントを開いて出力するには、デバッグ モード スイッチを true に設定します。 定義('DEBUG_MODE',false); クラス cls_tree { //データストレージモード 'file'|'db'|'mem' はそれぞれファイルとデータベースです // ファイルとして保存する場合は、ファイルの場所を指定する必要があります //データベースとして保存する場合は、テーブルを作成し、データベースリンク関連の構成情報を指定する必要があります。 プライベート$モード; private $db_host;//ホスト private $db_port; //ポートのデフォルトは 3306 private $db_user;//ユーザー名 private $db_pass;//パスワード private $db_name;//データベース名; private $tb_name;//ツリー構造テーブル名 private $file_name;//データファイルの場所 private $link_id;//データベースリンクID //private $link_tb;//ツリー ノードに関連付けられたテーブル名は、変更時に関連する変更に使用されます。 private $tree_name;//各ツリーの名前は、データベース テーブル内に複数存在する必要があります。 public $debug;// true に設定すると、デバッグ状態になります //コンストラクタ //データベースをリンクし、データベーステーブルをデータセンターとして使用します /*データベースまたはデータファイル名を使用して構築します 配列{ $db_host=NULL、 $db_user ,$db_pass ,$db_name, $ファイル名 } */ パブリック関数 __construct($mode='db',$name,$tb_file_name='tree',$db_data=NULL) { if($mode=='db')//データベース { $this->link_id=mysql_connect( $db_data['db_host'] , $db_data['db_user'] , $db_data['db_pass']); if(!$this->link_id) { echo 'MySQL サーバーに接続できません'; false を返します。 } if ( ! mysql_select_db($db_data['db_name'],$this->link_id) ) { echo 'MySQL データベースを使用できません'; false を返します。 } //デバッグモードを設定し、SQL文を出力します。 $this->debug=DEBUG_MODE; $this->tb_name=$tb_file_name; $this->tree_name=$name; mysql_query("名前を設定 'gb2312';",$this->link_id); }//データベースを使用してデータを保存する場合 else if($mode=='ファイル') { $this->file_name=$tb_file_name; } else if($mode=='mem') //その他のメソッドのメモリ { } それ以外 { die('ストレージ モードなしでオブジェクトを構築するとエラー'); } }//__構築 //ノードを追加する //親ノードIDが0の場合はルートノードとして挿入 // 挿入が成功すると挿入 ID が返されます 関数 addnode($fid=0,$data) { $data=mysql_escape_string($data);//MSYQL フィルタリング if($fid)//親ノードIDが0でない場合 { //親ノードIDがゼロでない場合は、親ノードが存在するかどうかを確認する必要があります $sql='select count(*) as sum from '.$this->tb_name.' where c_id='.$fid.' and c_name=''.$this->tree_name.'';'; $re=$this->db_query($sql); if($re[0]['sum']!=1) { $this->erro('親ノードが存在しません、親 ID:'.$fid.'<br />'); 戻る ; } //////挿入ノードを実行 $sql='「.$this->tb_name.」に挿入します。values(NULL,'."{$this->tree_name}','{$fid}','$data');"; if($this->db_query($sql)) { return mysql_insert_id($this->link_id); } それ以外 { false を返します。 } } //ルート ノードとして挿入します。ツリー名が 1 つのルート ノードしか使用されていないことを確認する必要があります。 それ以外 { $sql='select count(*) as sum from '.$this->tb_name. ' where c_name=''.$this->tree_name.'';'; $re=$this->db_query($sql); if($re[0]['sum']!=0) { $this->erro('ツリー名が存在してもツリーを作成できません:'.$this->tree_name.'<br />'); 戻る ; }それ以外 { $sql='「.$this->tb_name」に挿入します。 value(NULL,'."'{$this->tree_name}','{$fid}','$data');"; if($this->db_query($sql)) { return mysql_insert_id($this->link_id); } } } } <div class="clear"></div>