php专区

 首页 > php专区 > PHP进阶 > 算法 > 基于左右值的无限分类算法

基于左右值的无限分类算法

分享到:
【字体:


基于左右值的无限分类算法,php,由于之前采用的递归排序无限分类方法感觉不是很理想,于是参考了国外同国内的左右值排序相关方法,自己写了一个基于左右值的无限分类类,欢迎大家测试

演示地址 http://www.mengsa.cn/SortTest.php

请大家测试

另外还有用到一个mysql操作类,由于不是原创就不提供了,如果需要的可以PM我

[php]
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`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`=$Lft AND `Rgt`$Rgt";
     break; 
 case "4":
  $condition="`Lft`=$Rgt";
  break;
 default :
  $condition="`Lft`>$Lft AND `Rgt`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`tablefix."catagory` SET `Rgt`=`Rgt`-$Value-1 WHERE `Rgt`>$SelfRgt AND `Rgt`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`tablefix."catagory` SET `Rgt`=`Rgt`+$Value+1 WHERE `Rgt`>=$ParentRgt AND `Rgt`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)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,'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 ?>

分享到:
PHP中的钩子是什么,怎么理解它?
细说php - http://www.xishuophp.com/ PHP 写插件 其中的HOOK 只是别人想的一个词语,术语而已 并无实际意义 在WINDOWS编程中 HOOK==钩子  是一种消息机制的一种 意思就是:蚊子叮了你一口,你的大脑神经接收到了,于是指挥肢体,去赶走还是拍死这个蚊子 这个大脑神经就是HOOK,系统接收用户操作,而HOOK则...
详解:二进制、八进制、十进制、十六进制...
一、 十进制与二进制之间的转换  (1) 十进制转换为二进制,分为整数部分和小数部分  ① 整数部分  方法:除2取余,逆序排列,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……