亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

解析thinkphp的左右值無限分類

2020-03-22 20:27:28
字體:
來源:轉載
供稿:網友
以前一直使用父子無限分類,這種分類結構清晰,使用也簡單。但若分類數量很大的話,在查詢上性能不佳。比如在做導航菜單中,我要根據某一分類查詢出整個分類樹的話(祖輩)。
性能消耗是非常大的,要么做遞歸,要么做多次查詢。故,對于分類的數據量很大的情況,我推薦使用左右值,以減少查詢上的麻煩。
復制代碼 代碼如下:
_id
/**
+----------------------------------------------------------
* html' target='_blank'>構造函數
* @access public
* @return void
+----------------------------------------------------------
*/
public function __construct($left,$right,$id){
parent::__construct();
$this- _left = $left;
$this- _right = $right;
$this- _id = $id;
}
/**
+----------------------------------------------------------
* 根據node$this- _id得到該node的所有值
* @access public
* @param $nodeId
* @return array
+----------------------------------------------------------
*/
public function getNodeById($nodeId)
{
if($nodeId 0)
{
return $this- getById($nodeId);
}
else
{
throw_exception('未知$this- _id');
return false;
}
}
/**
+----------------------------------------------------------
* 獲取父節點,含直屬父類(type=1),所有父類:type=0
* @access public
* @param $nodeId int 節點$this- _id
* @return $parentNode array()
+----------------------------------------------------------
*/
public function getParentNode($nodeId,$type = 0)
{
if($nodeId == 0) throw_exception('未知$this- _id');;
$currentNode = $this- getNodeById($nodeId);
if($currentNode)
{
$condition = " ".$this- _left.' '.$currentNode[$this- _left].' and '.$this- _right.' '.$currentNode[$this- _right]." ";
if($type ==1) //直屬父類
{
return $this- where($condition)- order($this- _left." DESC")- limit(1)- find();
// $sql = "SELECT * FROM ".TABLE_NAME." WHERE {$condition} ORDER BY ".$this- _left." DESC LIMIT 1";
// return mysql_query($sql) or die(mysql_error());
}
else if($type ==0)
{
return $this- where($condition)- findAll();
// $sql = "SELECT * FROM ".TABLE_NAME." WHERE {$condition} ";
// return mysql_query($sql) or die(mysql_error());
}
}
else
{
return false;
}
}
/**
+----------------------------------------------------------
* 當前節點下子孫節點總數.子孫總數=(當前節點的右值 - 當前節點的左值-1)/2
* @access public
* @param $node_id int 節點$this- _id
* @return $amount int 該節點下的子孫總數 *
+----------------------------------------------------------
*/
public function getChildCount($nodeId)
{
$currentNode = $this- getNodeById($nodeId);
if(!empty($currentNode))
{
return (int)($currentNode[$this- _right]-$currentNode[$this- _left] -1)/2;
}
}
/**
+----------------------------------------------------------
* 獲取當前節點下所有子節點。 當 A子類的右節點=B子類左節點-1 則 A、B屬于同一級別
* @access public
* @param $curentId
* @param $type int 0:當前節點下所有子類,1為當前節點下一級子類
* @return bool
+----------------------------------------------------------
*/
public function getChild($nodeId,$type=0)
{
$currentNode = $this- getNodeById($nodeId);
if($currentNode[$this- _left]-$currentNode[$this- _right] ==1)
{
return false; //當 該節點左值 - 右值=1 時,其下沒有子節點。
}
else
{
$condition = $this- _left.' '.$currentNode[$this- _left].' and '.$this- _right .' '.$currentNode[$this- _right];
$child = $this- where($condition)- findAll();
if($type == 0)//所有子類
{
return $child;
}
else if($type ==1) //獲取當前節點下一級分類
{
$subArr = array(); //一級子類
foreach ($child as $k= $sub) {
//子類的左節點=父類左節點+1,則子類為第一個子類
if($sub[$this- _left]==$currentNode[$this- _left]+1)
{
//$right = $sub[$k][$this- _right]; //當前節點的右節點
$firstSub = $sub; //當前節點下第一個子類
array_push($subArr,$firstSub); //子類入棧
unset($child[$k]);
}
}
$rightVal = $firstSub[$this- _right]; //第一個子節點為比較標志
$childCount = count($child);//剩余子節點數
for($i=0;$i $childCount;$i++) //循環檢索出 同級子節點
{
foreach ($child as $key = $sub2) {
if($rightVal == $sub2[$this- _left]-1)
{
$rightVal = $sub2[$this- _right]; //把循環當前的node的右節點當做比較值
array_push($subArr,$sub2);
unset($child[$key]);
}
}
}
return $subArr;
}
}
}
/**
+----------------------------------------------------------
* 返回當前節點的完整路徑
* @access public
* @param $nodeId
* @return array
+----------------------------------------------------------
*/
public function getSinglePath($nodeId)
{
$sql = "select parent.* from __TABLE__ as node,__TABLE__ as parent where node.{$this- _left} between parent.{$this- _left}
AND parent.{$this- _right} AND node.{$this- _id} = {$nodeId} order by parent.{$this- _left}";
// echo $sql;
return $this- query($sql);
}
/**
+----------------------------------------------------------
* 添加子節點,分3種:0:在當前節點下最后追加一個子節點;1:在當前節點下追加第一個子節點;

2:在當前節點下的某個子節點后追加
復制代碼 代碼如下:
* @access public
* @param $currentId int
* @param $nodeName string 新節點名稱
* @param $targetId int 追加到當前節點下子節點的指定節點后
* @return bool
+----------------------------------------------------------
*/
public function addNode($nodeId,$newData,$type=0,$targetId=0)
{
if(empty($newData))
{
throw_exception('新分類不能為空');
}
$currentNode = $this- getNodeById($nodeId);
switch ($type) {
case 0:
$leftNode = $currentNode[$this- _right]; //新節點的左值為父節點的右值
$rightNode = $leftNode+1;
break;
case 1:
$leftNode = $currentNode[$this- _left]+1; //新節點的左值為父節點的左值+1
$rightNode = $leftNode+1;
break;
case 2:
$otherNode = $this- getNodeById($targetId);
$leftNode = $otherNode[$this- _right]+1;
$rightNode = $leftNode+1;
default:
break;
}
// $sql = "UPDATE ".TABLE_NAME." SET ".$this- _right."=".$this- _right."+2 WHERE ".$this- _right." = ".$leftNode;
// $sql2 = "UPDATE ".TABLE_NAME." SET ".$this- _left."=".$this- _left."+2 WHERE ".$this- _left." ".$leftNode;
$this- setInc($this- _right,$this- _right." =".$leftNode,2); //把所有右值大于新節點左值的節點的右值+2,注意效率
$this- setInc($this- _left,$this- _left." ".$leftNode,2); //把所有大于新節點的左值+2
$newData[$this- _left] = (int)$leftNode;
$newData[$this- _right] =(int) $rightNode;
return $this- add($newData);
}
/**
+----------------------------------------------------------
* 刪除節點
* @access public
* @param type 操作類型,默認為0刪除當前節點下的所有子節點,1為刪除包括自身的節點
* @param $nodeId int 要刪除的$this- _id
* @return bool
+----------------------------------------------------------
*/
public function rmNode($nodeId,$type =1)
{
$currentNode = $this- getNodeById($nodeId);
if($type == 1) //刪除包含自身的節點
{
$sql = "DELETE FROM __TABLE__ WHERE ".$this- _left." = {$currentNode[$this- _left]} AND ".$this- _right." = {$currentNode[$this- _right]}";
$childCount = ($this- getChildCount($nodeId)+1)*2; //要更新的值
$sql2 = "UPDATE __TABLE__ SET ".$this- _right."=".$this- _right."-".$childCount." WHERE ".$this- _right." ".$currentNode[$this- _right];
$sql3 = "UPDATE __TABLE__ SET ".$this- _left."=".$this- _left."-".$childCount." WHERE ".$this- _left." ".$currentNode[$this- _left];
}
else //刪除當前節點下的所有節點
{
$sql ="DELETE FROM __TABLE__ WHERE ".$this- _left." {$currentNode[$this- _left]} AND ".$this- _right." {$currentNode[$this- _right]}";
$childCount = $this- getChildCount($nodeId)*2; //要更新的值
$sql2 = "UPDATE __TABLE__ SET ".$this- _right."=".$this- _right ."-".$childCount." WHERE ".$this- _right." =".$currentNode[$this- _right];
$sql3 = "UPDATE __TABLE__ SET ".$this- _left."=".$this- _left."-".$childCount." WHERE ".$this- _left." ".$currentNode[$this- _left];
}
$this- execute($sql);
$this- execute($sql2);
$this- execute($sql3);
return true;
}
/**
+----------------------------------------------------------
* 修改節點,名稱等
* @access public
* @param $newData array()必須含有 要修改的$this- _id,k-v必須對齊,如arr['node_name'] = '商品'
* @return bool
+----------------------------------------------------------
*/
public function modiNode($newData)
{
if(!empty($newData))
{
$id = $newData[$this- _id];
unset($newData[$this- _id]);
return $this- save($newData,$this- _id.'='.$id);
}
}
}
?

PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国外成人免费在线播放| 中文字幕综合一区| 欧美日韩激情视频8区| 亚洲国产另类 国产精品国产免费| 国产精品久久久久久av福利软件| 海角国产乱辈乱精品视频| 久久免费少妇高潮久久精品99| 青青草原成人在线视频| 欧美丝袜一区二区三区| 国产亚洲精品综合一区91| 成人网中文字幕| 91精品国产自产在线| 亚洲国产精品专区久久| 国产精品一香蕉国产线看观看| 欧美精品激情在线观看| 亚洲热线99精品视频| 久久精品国产一区二区三区| 777国产偷窥盗摄精品视频| 欧美日韩精品中文字幕| 欧美日韩中文字幕日韩欧美| 亚洲天堂日韩电影| 亚洲精品日韩激情在线电影| 亚洲人成电影网站色…| 欧美成人剧情片在线观看| 亚洲美女av网站| 欧美日韩免费在线| 中文字幕一精品亚洲无线一区| 日韩在线视频观看正片免费网站| 欧美交受高潮1| 26uuu日韩精品一区二区| 国产欧美最新羞羞视频在线观看| 中文字幕亚洲无线码a| 成人免费高清完整版在线观看| 日韩在线视频中文字幕| 亚洲成色www8888| 亚洲一品av免费观看| 国产综合在线视频| 91国产一区在线| 一区二区三欧美| 国外视频精品毛片| 国产mv久久久| 日本精品视频在线| 欧美专区在线观看| 欧美日韩免费一区| 国产成人精品av| 国产欧美日韩中文| 国产经典一区二区| 91国语精品自产拍在线观看性色| 宅男66日本亚洲欧美视频| 欧美日韩国产在线看| 精品视频中文字幕| 久久久av亚洲男天堂| 久久久久在线观看| 97国产精品人人爽人人做| 日韩av片永久免费网站| 热99精品只有里视频精品| 欧美在线视频网| 日本免费一区二区三区视频观看| 午夜精品久久久久久久久久久久| 中文字幕久久久| 精品欧美激情精品一区| 精品电影在线观看| 日韩资源在线观看| 日韩有码在线播放| 日韩欧美高清视频| 色综合久久悠悠| 日本一本a高清免费不卡| 国产欧美精品久久久| 少妇久久久久久| www.国产精品一二区| 国产精品高潮呻吟视频| 91在线观看免费高清| 日韩av电影中文字幕| 亚洲欧美制服第一页| 欧美人交a欧美精品| 日韩av网站电影| 国产精品美女午夜av| 国产精品视频导航| 亚洲第一福利在线观看| 国产午夜精品一区理论片飘花| 韩日精品中文字幕| 亚洲精品久久久久中文字幕欢迎你| 国产精品一二三在线| 欧美激情欧美狂野欧美精品| 国产精品久久久久久久久久99| 5278欧美一区二区三区| 成人日韩在线电影| 色樱桃影院亚洲精品影院| 久久福利网址导航| 国产精品mp4| 亚洲xxx视频| 久久影视电视剧免费网站| 色妞色视频一区二区三区四区| 成人av色在线观看| 精品国产91久久久久久老师| 亚洲三级av在线| 国产精品夜间视频香蕉| 欧美激情综合色| 亚洲aaa激情| 在线精品国产成人综合| 亚洲欧美中文日韩在线| 国产剧情久久久久久| 国产91精品最新在线播放| 亚洲人成在线观| xvideos成人免费中文版| 日韩免费看的电影电视剧大全| 中文字幕日韩在线播放| 国产精品福利小视频| 在线看福利67194| 精品久久久久久中文字幕| 成人精品视频99在线观看免费| 中文字幕精品在线| 国产亚洲精品高潮| 国模精品一区二区三区色天香| 精品久久久久久亚洲国产300| 欧美日韩免费在线| 欧美中文字幕在线播放| 日韩视频在线一区| 亚洲电影免费观看| 97超级碰在线看视频免费在线看| 欧美极品在线视频| 亚洲美女黄色片| 国产视频自拍一区| 国产日韩在线一区| 亚洲直播在线一区| 国产一区二区三区视频免费| 国产精品精品久久久久久| 成人av在线网址| 欧美最顶级丰满的aⅴ艳星| 欧美超级免费视 在线| 国产美女扒开尿口久久久| 国产99久久精品一区二区 夜夜躁日日躁| 国内精品视频在线| 欧美极品第一页| 亚洲欧美日本精品| 97人人爽人人喊人人模波多| 日韩中文字幕在线视频| 欧美午夜性色大片在线观看| 欧美日韩午夜剧场| 亚洲精品丝袜日韩| 成人精品久久av网站| 色综合色综合久久综合频道88| 成人免费激情视频| 欧美怡红院视频一区二区三区| 午夜欧美不卡精品aaaaa| 永久免费看mv网站入口亚洲| 尤物九九久久国产精品的特点| 欧美激情影音先锋| 亚洲成av人片在线观看香蕉| 欧美激情国内偷拍| 国产福利视频一区| 国内精品久久久久久影视8| 91大神福利视频在线| 欧美日本啪啪无遮挡网站| 欧美午夜宅男影院在线观看| 中文字幕国产亚洲| 国产日韩精品视频| 欧美激情在线播放| 欧美巨猛xxxx猛交黑人97人| 欧美专区日韩视频| 国产精品久久久久久影视| 日韩有码视频在线| 国产一区视频在线播放| 久久精品中文字幕免费mv|