發一個自己寫的PHP樹類 tree for php,該如何解決

來源:互聯網
上載者:User
發一個自己寫的PHP樹類 tree for php
自己經常在做無限極分類的時候
需要傳說中的資料結構之樹
但是找了一下
貌似找不到合適我自己的
今天就寫了一個
拿出來晒晒
需要資料庫支援的無限極 樹類

希望各位朋友指點、補充,
-------------開源宣言--------------
開源給我們帶來的應該是減少重複性的工作
達到共同提高

PHP code
'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為資料域function addnode($fid=0,$data)3、修改一個結點的資訊 只能修改FID和DATA域//如果不指定 。預設不修改function mdfnode($node_id,$fid=false,$data=false)4、刪除結點及其子節點 id為結點ID mode為刪除模式 ture為直接刪除 false為將指定結點和子節點移動到一個新樹中 並返回隨機的新樹的名稱function deletenode($id,$mode=true)5、擷取子節點函數 不包括指定的根節點 遞迴調用函數function getsub($fid,$deep=8888,$storage_mode=true,$recall=NULL)$fid為根結點ID$deep:遍曆深度 從1開始 1即是子節點 2是孫結點$storage_mode=true時 使用多維陣列返回父子關係$storage_mode=false時 使用一維數組返回 不記錄父子關係$recall 回呼函數 如果不為空白 在遍曆過程中 每個資料都將調用該函數 回呼函數定義如下function function_name($node_data,$deep); $node_data為結點資料 deep為深度,從1開始 表示該結點到所指定根結點(fid)的距離回呼函數參數傳遞時如下所示function myfunction($node_data,$deep){code};//自訂函數$tree1->getsub(0,8888,true,"myfunction")//使用函數名作為參數當儲存為多維陣列的時候結構如下    array    (        fid1=>array(),        fid2=>array        (            fid21=>array(id,name,fid,data),            fid22=>array(id,name,fid,data),        )        $fid3=>data;    )    其中fid1,fid2……為根節點的ID 其對應值為子節點資訊    //注意:只有葉子節點才能返回具體資料    //$deep為深度 預設為-1,表示返回所有 例如deep=1時,返回第一層子節點6、擷取結點資訊 返回結點資訊 並為數組添加索引值為 sub_count=>子節點數量    function getnode(4);7、//擷取根向上類別資訊    function getfarlist($node_id,$fadeep)    //@param:$fadeep 向上的等級 返回資料從最靠近的排在前面 fadeep從1開始  返回一個二維數組    8、提交查詢 如果為insert update delete 只返回true or false 如果為SELEC 返回二維數組    function    db_query($sql)9、錯誤資訊函數 可以自訂修改 目前只是顯示錯誤資訊    function    erro($msg);*///設定偵錯模式開關 true 為開啟 輸出SQL語句 define('DEBUG_MODE',false);class cls_tree{    //資料存放區的模式 'file'|'db'|'mem'分別為檔案和資料庫    //如果存為檔案 需要指定檔案位置    //如果存為資料庫 需要建立表 並指定資料庫連結相關配置資訊        private $mode;        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 的時候為調試狀態        //建構函式    //連結資料庫 使用資料庫表作為資料中心    /*用資料庫或者資料檔案名 來構造    array{        $db_host=NULL,        $db_user        ,$db_pass        ,$db_name,        $filename        }        */    public function __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 'Can not connect MySQL Server';                return false;            }                if ( ! mysql_select_db($db_data['db_name'],$this->link_id) )            {                    echo 'Can not use MySQL Database';                      return false;            }                        //設定偵錯模式 輸出SQL語句            $this->debug=DEBUG_MODE;                                    $this->tb_name=$tb_file_name;            $this->tree_name=$name;                        mysql_query("set names 'gb2312';",$this->link_id);                    }//如果使用資料庫儲存資料                    else if($mode=='file')        {            $this->file_name=$tb_file_name;        }        else if($mode=='mem')    //其他方式 記憶體        {                    }        else        {            die('erro to construct object without storage mode');        }    }//__construct        //添加一個結點     //如果父節點ID為0 插入為根節點    //插入成功返回插入ID    function 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('not exist parent node ,parent id:'.$fid.'
'); return ; } //////執行插入結點 $sql='insert into '.$this->tb_name.' values(NULL,'."'{$this->tree_name}','{$fid}','$data');"; if($this->db_query($sql)) { return mysql_insert_id($this->link_id); } else { return false; } } //插入為根節點 需要查詢樹名稱是否已經被使用 一個樹只有一個根節點 執行插入結點 else { $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('can not create tree,even existed tree name:'.$this->tree_name.'
'); return ; } else { $sql='insert into '.$this->tb_name.' values(NULL,'."'{$this->tree_name}','{$fid}','$data');"; if($this->db_query($sql)) { return mysql_insert_id($this->link_id); } } } }
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.