自分で書いたPHPツリークラス、php用ツリー、その解決方法を送る

WBOY
リリース: 2016-06-13 13:50:36
オリジナル
893 人が閲覧しました

自分で書いた php 用の PHP ツリー型ツリーを投稿します
Infinitus 分類を行うときによくレジェンダリー データ構造ツリーが必要になります
ですが、検索した結果
が私に適したものを見つけることができないようです
今日
を書いて見せました
データベースのサポートを必要とする Infinitus ツリー クラス

友人が私にアドバイスや補足を与えてくれることを願っています。
----- - -------オープンソース宣言--------------
オープンソースが私たちにもたらすものは、共通の改善を達成するために
反復作業を削減することであるべきです

PHP コード
<!--

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>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート