發一個自己寫的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); } } } }