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

PHP无限分类[左右值]算法

<?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://www.chinaunix.net/jh/27/239532.html(http://dev.mysql.com/tech-resources/articles/hierarchical-data.html)

* @author [email][email protected][/email]

* @version         1.0

* @copyright psdshow

* 欢迎光临我的个人日志 http://www.dayanmei.com

*/

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 "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">";

echo "<meta http-equiv=refresh content=$sec;URL=$url>";

if(is_array($msg)){

foreach($msg as $key=>$value){

echo $key."=>".$value."<br>";

}

}else{

echo $msg;

}

exit;

} // end func

} // end class

?>

函数描述及例子


PHP无限分类[左右值]算法

时间: 2024-10-11 00:28:35

php基于左右值排序的无限分类算法的相关文章

数据库结果为 基于左右值排序的无限分类算法

<?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 defau

【Stackoverflow好问题】Map&lt;Key,Value&gt;基于Value值排序

问题 Map<Key,Value>如何基于Value值排序 精华回答 方法1: 使用TreeMap,可以参考下面的代码 public class Testing { public static void main(String[] args) { HashMap<String,Double> map = new HashMap<String,Double>(); ValueComparator bvc = new ValueComparator(map); TreeMa

基于朴素贝叶斯分类器的文本分类算法

源代码下载:NaviveBayesClassify.rar Preface 文本的分类和聚类是一个比较有意思的话题,我以前也写过一篇blog<基于K-Means的文本聚类算法>,加上最近读了几本数据挖掘和机器学习的书籍,因此很想写点东西来记录下学习的所得. 在本文的上半部分<基于朴素贝叶斯分类器的文本分类算法(上)>一文中简单介绍了贝叶斯学习的基本理论,这一篇将展示如何将该理论运用到中文文本分类中来,具体的文本分类原理就不再介绍了,在上半部分有,也可以参见代码的注释. 文本特征向量

Map&lt;Key,Value&gt;基于Value值排序

Map<Key,Value> 排序默认是按照KEY值的升序来进行. 针对按照Value来进行排序有两种方法: 第一种 使用TreeMap  代码如下 public class test{ public static void main(String[] args) { HashMap<String, Double> map = new HashMap<String, Double>(); valueComparator vComparator = new valueCo

30行内写个无限分类算法(非递归)

**算法不一定是首创,但一定是原创哈! 我自己给这个算法取个名字,叫"一致无限分类法"..哈哈!** 奉上代码:(使用的thinkphp框架) public function menu(){ $data = M('menu') -> select(); //获取数据 $data = $this -> index_to_key($data,'menu_id'); //把primary key转移到数组索引上去 foreach($data as &$one){ $one

基于Spark的机器学习实践 (九) - 聚类算法

0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法都需要用户输入的训练数据集中给定一个个明确的y值 1.2 k-平均算法与无监督学习 ◆ k-平均算法是无监督学习的一种 ◆ 它不需要人为指定一个因变量,即标签y ,而是由程序自己发现,给出类别y ◆ 除此之外,无监督算法还有PCA,GMM等 源于信号处理中的一种向量量化方法,现在则更多地作为一种聚类

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序

思路: 桶排序 N个数,设置 N+ 1 个桶,,一定有一个空桶,,为的是保证最大差值一定是不是出现在同一个桶中: 只要比较 非空桶 的最小值,与前一个 非空桶的最大值,求 最大的差值, 1 package my_basic; 2 3 import java.text.Bidi; 4 import java.util.Arrays; 5 6 public class MaxGap { 7 8 /*给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排

深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现

1.session的注意点:@session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] session_start()前的输出问题:[session信息本身会增加到http头信息,也就是http主体不能在头前]对php.ini中的输出缓存进行配置,out_buffer的配置[注意:开启之后能够保证输出内容在脚本中缓存] [注意](1)脚本中session变量的键只能是字符串类型的[$_SE

php无限分类

无限分类,是指从一个最高分类开始,每个子分类都可以分出自己的若干个子分类,可以一直分下去,称为无限级分类: 比如一棵树,从一根树干开始,分出多个树枝,而这些树枝又分出其他的分支,理论上是可以无限分裂下去的: 再比如,一个家庭可以有若干个子女,我们把这些子女看做是第一级分类.而这些子女,又会各自组建自己的家庭,当他们有了自己的后代,就是第二级分类,如果每个家庭都有一个以上的子女,理论上是可以无限分裂的: 在php中,无限分类的表现形式如下图所示: 我们同过id和pid两个字段来连接父级分类和子集分