ホームページ  >  記事  >  php教程  >  数日前に書いた無限分類クラス

数日前に書いた無限分類クラス

WBOY
WBOYオリジナル
2016-06-13 12:34:08778ブラウズ

これは 1 週間前に書きましたが、実際に使ってみると非常にうまく機能しています。

主なアイデアの出典: http://www.phpobject.net/b...[url=http://www.phpobject.net/blog/read.php?49][/url ]

ここでは原理は説明しません。コードを直接送信してください。

PS: このコードは直接使用できないため、他のライブラリ クラスと組み合わせる必要があります。ここでは主に分類の考え方を紹介します。

コードをコピー コードは次のとおりです:


<
/** 
--
-- 表の構造 `daxue8_category`
--

CREATE TABLE `daxue8_category` (
`cid` smallint(6) NOT NULL auto_increment,
`pid` smallint(6) NOT NULL default '0',
`level` smallint(6) NOT NULL default '0',
`cname` char(64) NOT NULL default '',
`lft` smallint(6) NOT NULL デフォルト '0',
`rgt` smallint(6) NOT NULL デフォルト '0',
`uid` mediumint(8) NOT NULL デフォルト '0',
`username` char(32) NOT NULL default '',
`ctime` int(10) NOT NULL default '0',
`cstate` tinyint(1) NOT NULL default '0',
`gnum` mediumint(8) NOT NULL default '0',
`orderstyle` smallint(3) NOT NULL default '0',
PRIMARY KEY (`cid`)
) TYPE=MyISAM AUTO_INCREMENT =2; 

--
-- 表中のデータ `daxue8_category`
--

INSERT INTO `daxue8_category` VALUES (1, 0, 1, 'root', 1 , 2, 0, '管理员', 1163608814, 1, 0, 0); 
*/
クラスカテゴリ
{
var $module;

var $tbname; 🎜> 関数 category()
{
$this->tbname=TB_PREX.'_category'
$this->module=new module($this->tbname); }

/**
* 子ノードの追加
* @param array $node 追加する子ノードの属性
* @param int $pid 親ノードの ID
*/
function add($node,$pid){
//ノードが既に存在するかどうかを確認します
if($node_exist=$this- >module->detail('where pid='.$pid.' and cname=''.$node['cname'].''')){ __FUNCTION__.'(): ノード ' 。$ node [cname ']。 '.$pnode['rgt']);
$this->module->query('update ` '.$this->tbname.'` set rgt=rgt 2 where rgt>='. $pnode['rgt']);
//新しいノードを挿入
$node['pid']= $pid; $node['lft']=$pnode['rgt'];
$node['rgt']=$pnode['rgt'] 1;
$node['level ']=$pnode['level'] 1; // レベルを 1 つ追加します
return $ this->module->add($node);
}

/**
* ノードの削除
* @param $cid 削除するノードの ID
* @param $delete_childern ノードに子ノードがある場合、強制的に削除するかどうか。設定が true でない場合、子ノードが存在する場合、削除は失敗し false を返します
* *
*/
function delete($cid,$delete_childern=false)
{
//ノード情報を取得
$node=$this->get_by_cid($cid);
if(($this->child_num($node)>0)&&(!$delete_childern)) $this-> ;error(__FUNCTION__.'(): このノードには子ノードがあります。');
//ノードとそのすべての子ノードを削除します
$this->module->delete('where lft between '.$node['lft'].' と '.$node ['rgt']);
//対応する左右のキーの値を変更します
$plus=$node['rgt']-$node['lft'] 1; ->module ->query('update `'.$this->tbname.'` set lft=lft-'.$plus.' where lft>'.$node['rgt']); > $this- >module->query('update `'.$this->tbname.'` set rgt=rgt-'.$plus.' where rgt>'.$node['rgt']) ;
return true;
}

/**
* ノードを更新します
* @param array $set update set
* @param int $cid 更新されたノードの主キー ID
*/
function update($set,$cid){
return $this->module-> ;update($ set,'where cid='.$cid); > // ノード情報を取得します'rgt'];
if(!empty($deep))$where.=' および level<'.$ node['level'] $deep;
if($deep==1){
$where.=' orderstyle desc で並べ替える' 🎜> return $this->module->ここで);
}

/**
* ノードとそのサブノードを選択します
* @param int $cid ノードの主キー ID
* @param int $deep 選択の深さ
*/
function get_parent($cid)
{
$node=$this->get_by_cid( $cid) ;
return $this->module->select('where lft<='.$node['lft'].' and rgt>='.$node['rgt'].' order by lft asc');

/**
* 子ノードを選択します*/
function get_children($pid,$deep=0){
//获取节点情報
$pnode=$this->get_by_cid($pid) ; 
$where='where lft>'.$pnode['lft'].' そしてrgt if(!empty($deep))$where.=' and level<='.($pnode['level'] $deep); 
if($deep==1){
$where.=' order by orderstyle desc'; 
}else{
$where.='order by lft asc';             
}
return $this->module->select($where); 
}

/**
* 深層サブノードを取得します
* @param int $cid ノードの主キー ID
* @param int $deepselection Depth
*/
function get_level_children($pid,$deep){
//获取节点情報
$pnode=$this-> get_by_cid($pid); 
$where='where lft>'.$pnode['lft'].' そしてrgt $where.=' and level='.($pnode['level'] $deep); 
$where.=' order by orderstyle desc'; 
return $this->module->select($where); 
}

/**
* ノード情報の取得
* @param $cid ノードの主キー ID
* @return array $node
*/
function get_by_cid($cid){
$node=$this->module->detail('where cid=' .$cid); 
if(!$node)$this->error(__FUNCTION__.'():获取节点'.$cid.'失败!'); 
$node を返す; 
}
/**
* 子ノードの数を取得
* @param array $node ノード情報
* @return num
*/
function child_num($node){
return ($node['rgt']-$node['lft']-1)/2 ; 
}
/**
* 階層による分類を表示
* @param int $cid ノードの主キー ID
* @output
*/
function display($cid)
{
$nodes=$this->select($cid); 
foreach($nodes as $node){
echo str_repeat(' ',$node['level']-1).$node['cname']."n"; 
}
}
/*-------private----------------------------- ------*/

function error($msg){
die('ERROR : file '.__FILE__.' function '.$msg); 
}
}
?> 

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。