Chinaunix首页 | 论坛 | 博客
  • 博客访问: 503433
  • 博文数量: 81
  • 博客积分: 7010
  • 博客等级: 少将
  • 技术积分: 1500
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-15 10:51
文章分类

全部博文(81)

文章存档

2011年(1)

2009年(22)

2008年(58)

我的朋友

分类:

2008-04-12 03:10:37

php
/**
    * 基于左右值排序的无限分类算法
    * 数据库结果为
CREATE TABLE om_catagory (
     CatagoryID int(10) unsigned NOT NULL auto_increment,
    Name varchar(50) default '',
     Lft int(10) unsigned NOT NULL default '0',
     Rgt int(10) unsigned NOT NULL default '0',
     PRIMARY KEY (id),
     KEY lft (lft),
     KEY rgt (rgt) 
)
    * 更多的关于左右值排序的例子
    * (http://dev.mysql.com/tech-resources/articles/hierarchical-data.html)
    * @author [email]psdshow@yahoo.com.cn[/email] 
    * @version         1.0
    * @copyright psdshow
    * 欢迎光临我的个人日志 
    */
class 
sortclass
{


/**
    * Description
    * @var         
    * @since         1.0
    * @access     private
    */
var $db
;


/**
    * Description
    * @var         
    * @since         1.0
    * @access     private
    */
var $tablefix
;


/**
    * Short description. 
    * 构造函数,引入数据库操作类函数
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function sortclass
()
{
global 
$db
;
$this->db=$db
;
$this->tablefix="om_"
;
// end func


/**
    * Short description. 
    * 增加新的分类
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function addsort($CatagoryID,$SortName
)
{
if(
$CatagoryID==0
){
    
$Lft=0
;
    
$Rgt=1
;
    }else{
    
$Result=$this->checkcatagory($CatagoryID
);
    
//取得父类的左值,右值
    
$Lft=$Result['Lft'
];
    
$Rgt=$Result['Rgt'
];
    
$this->db->query("UPDATE `".$this->tablefix."catagory` SET `Lft`=`Lft`+2 WHERE `Lft`>$Rgt"
);
    
$this->db->query("UPDATE `".$this->tablefix."catagory` SET `Rgt`=`Rgt`+2 WHERE `Rgt`>=$Rgt"
);
    }


//插入
if($this->db->query("INSERT INTO `".$this->tablefix."catagory` SET `Lft`='$Rgt',`Rgt`='$Rgt'+1,`Name`='$SortName'"
)){
    
//$this->referto("成功增加新的类别","JAVASCRIPT:HISTORY.BACK(1)",3);
    
return 1
;
    }else{
    
//$this->referto("增加新的类别失败了","JAVASCRIPT:HISTORY.BACK(1)",3);
    
return -1
;
    }
// end func 



/**
    * Short description. 
    * 删除类别
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function deletesort($CatagoryID
)
{
//取得被删除类别的左右值,检测是否有子类,如果有就一起删除
$Result=$this->checkcatagory($CatagoryID
);
$Lft=$Result['Lft'
];
$Rgt=$Result['Rgt'
];
//执行删除
if($this->db->query("DELETE FROM `".$this->tablefix."catagory` WHERE `Lft`>=$Lft AND `Rgt`<=$Rgt"
)){
    
$Value=$Rgt-$Lft+1
;
    
//更新左右值
    
$this->db->query("UPDATE `".$this->tablefix."catagory` SET `Lft`=`Lft`-$Value WHERE `Lft`>$Lft"
);
    
$this->db->query("UPDATE `".$this->tablefix."catagory` SET `Rgt`=`Rgt`-$Value WHERE `Rgt`>$Rgt"
);
    
//$this->referto("成功删除类别","javascript:history.back(1)",3);
    
return 1
;
    }else{
    
//$this->referto("删除类别失败了","javascript:history.back(1)",3);
    
return -1
;
    }
// end func


    


/**
    * Short description. 
    * 1,所有子类,不包含自己;2包含自己的所有子类;3不包含自己所有父类4;包含自己所有父类
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function getcatagory($CatagoryID,$type=1
)
{
$Result=$this->checkcatagory($CatagoryID
);
$Lft=$Result['Lft'
];
$Rgt=$Result['Rgt'
];
$SeekSQL="SELECT * FROM `".$this->tablefix."catagory` WHERE "
;
switch (
$type
) {
     case 
"1"
:
    
$condition="`Lft`>$Lft AND `Rgt`<$Rgt"
;
    break;
    case 
"2"
:
    
$condition="`Lft`>=$Lft AND `Rgt`<=$Rgt"
;
    break;
     case 
"3"
:
         
$condition="`Lft`<$Lft AND `Rgt`>$Rgt"
;
         break; 
    case 
"4"
:
    
$condition="`Lft`<=$Lft AND `Rgt`>=$Rgt"
;
    break;
    default :
    
$condition="`Lft`>$Lft AND `Rgt`<$Rgt"
;
    ;
    } 
$SeekSQL.=$condition." ORDER BY `Lft` ASC"
;
$Sorts=$this->db->getrows($SeekSQL
);
return 
$Sorts
;
// end func



/**
    * Short description. 
    * 取得直属父类
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function getparent($CatagoryID
)
{
$Parent=$this->getcatagory($CatagoryID,3
);
return 
$Parent
;
// end func
/**
    * Short description. 
    * 移动类,如果类有子类也一并移动
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function movecatagory($SelfCatagoryID,$ParentCatagoryID
)
{
$SelfCatagory=$this->checkcatagory($SelfCatagoryID
);
$NewCatagory=$this->checkcatagory($ParentCatagoryID
);


$SelfLft=$SelfCatagory['Lft'
];
$SelfRgt=$SelfCatagory['Rgt'
];
$Value=$SelfRgt-$SelfLft
;
//取得所有分类的ID方便更新左右值
$CatagoryIDS=$this->getcatagory($SelfCatagoryID,2
);
foreach(
$CatagoryIDS as $v
){
    
$IDS[]=$v['CatagoryID'
];
    }
$InIDS=implode(",",$IDS
);


$ParentLft=$NewCatagory['Lft'
];
$ParentRgt=$NewCatagory['Rgt'
];
//print_r($InIDS);
//print_r($NewCatagory);
//print_r($SelfCatagory);
//exit;
if($ParentRgt>$SelfRgt
){
    
$UpdateLeftSQL="UPDATE `".$this->tablefix."catagory` SET `Lft`=`Lft`-$Value-1 WHERE `Lft`>$SelfRgt AND `Rgt`<=$ParentRgt"
;
    
$UpdateRightSQL="UPDATE `".$this->tablefix."catagory` SET `Rgt`=`Rgt`-$Value-1 WHERE `Rgt`>$SelfRgt AND `Rgt`<$ParentRgt"
;
    
$TmpValue=$ParentRgt-$SelfRgt-1
;
    
$UpdateSelfSQL="UPDATE `".$this->tablefix."catagory` SET `Lft`=`Lft`+$TmpValue,`Rgt`=`Rgt`+$TmpValue WHERE `CatagoryID` IN($InIDS)"
;
    }else{
    
$UpdateLeftSQL="UPDATE `".$this->tablefix."catagory` SET `Lft`=`Lft`+$Value+1 WHERE `Lft`>$ParentRgt AND `Lft`<$SelfLft"
;
    
$UpdateRightSQL="UPDATE `".$this->tablefix."catagory` SET `Rgt`=`Rgt`+$Value+1 WHERE `Rgt`>=$ParentRgt AND `Rgt`<$SelfLft"
;
    
$TmpValue=$SelfLft-$ParentRgt
;
    
$UpdateSelfSQL="UPDATE `".$this->tablefix."catagory` SET `Lft`=`Lft`-$TmpValue,`Rgt`=`Rgt`-$TmpValue WHERE `CatagoryID` IN($InIDS)"
;
    }
$this->db->query($UpdateLeftSQL
);
$this->db->query($UpdateRightSQL
);
$this->db->query($UpdateSelfSQL
);
//$this->referto("成功移动类别","javascript:history.back(1)",3);
return 1
;
// end func


/**
    * Short description. 
    *
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function checkcatagory($CatagoryID
)
{
//检测父类ID是否存在
$SQL="SELECT * FROM `".$this->tablefix."catagory` WHERE `CatagoryID`='$CatagoryID' LIMIT 1"
;
$Result=$this->db->getrow($SQL
);
if(
count($Result)<1
){
    
$this->referto("父类ID不存在,请检查","javascript:history.back(1)",3
);
    }
return 
$Result
;     
// end func


/**
    * Short description. 
    *
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         array($Catagoryarray,$Deep)
    * @update         date time
*/
function sort2array($CatagoryID=0
)
{
     
$Output 
= array();
     if(
$CatagoryID==0
){
    
$CatagoryID=$this->getrootid
();
    }
     if(empty(
$CatagoryID
)){
    return array();
    exit;
    }
     
$Result $this->db->query('SELECT Lft, Rgt FROM `'.$this->tablefix
.
                                 
'catagory` WHERE `CatagoryID`='.$CatagoryID
); 
     if(
$Row $this->db->fetch_array($Result
)) {
     
$Right 
= array(); 
     
$Query 'SELECT * FROM `'.$this->tablefix
.
                 
'catagory` WHERE Lft BETWEEN '.$Row['Lft'].' AND '

                 
$Row['Rgt'].' ORDER BY Lft ASC'
;
     
     
$Result $this->db->query($Query
); 
     while (
$Row $this->db->fetch_array($Result
)) { 
         if (
count($Right)>0
) { 
    while (
$Right[count($Right)-1]<$Row['Rgt'
]) { 
    
array_pop($Right
);
    } 
         }
    
$Output[]=array('Sort'=>$Row,'Deep'=>count($Right
));
     
$Right[] = $Row['Rgt'
];
     }
     }
     return 
$Output
;     
// end func



/**
    * Short description. 
    *
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function getrootid
()
{
$Query="SELECT * FROM`".$this->tablefix."catagory` ORDER BY `Lft` ASC LIMIT 1"
;
$RootID=$this->db->getrow($Query
);
if(
count($RootID)>0
){
    return 
$RootID['CatagoryID'
];
    }else{
    return 
0
;
    }
// end func


/**
    * Short description. 
    *
    * Detail description
    * @param         none
    * @global         none
    * @since         1.0
    * @access         private
    * @return         void
    * @update         date time
*/
function referto($msg,$url,$sec
)
{
    echo 
""
;
    echo 
""
;
         if(
is_array($msg
)){
    foreach(
$msg as $key=>$value
){
    echo 
$key."=>".$value."
"
;
             }
             }else{
             echo 
$msg
;
             }
     exit;
// end func
// end class


?>

阅读(2141) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~