本文目錄一覽:
PHP無限樹形根統計數據
function getlow($topid){
$array=array();
$result = mysql_query(‘SELECT * FROM `user` WHERE `topid` = ‘.$topid);
if(mysql_num_rows($result) 0){
while($a = mysql_fetch_array($result,MYSQL_ASSOC)){
$b = getlow($a[‘id’]);
if(count($b) 0){
$array[$a[‘id’]] = $b;
}else{
$array[$a[‘id’]] = $a[‘id’];
}
}
}
return $array;
}
測試無誤
請教高手:php實現n叉樹遍歷
要構建的無限分類的模型. 電子產品是最大的分類.家用電器 ,數碼產品是其子分類.可以看到子分類是被父分類包含起來的.每個分類都有左右 兩個節點編號分別是1、2、3…..
根據上面的圖mysql中建立表和插入數據
CREATE TABLE `product_categories` (
`id` MEDIUMINT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`name` VARCHAR( 20 ) NOT NULL ,
`left_node` MEDIUMINT( 8 ) NOT NULL ,
`right_node` MEDIUMINT( 8 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO `product_categories` (`id`, `name`, `left_node`, `right_node`) VALUES(1, ‘電子產品’, 1, 20),
(2, ‘家用電器’, 2, 9),
(3, ‘電視機’, 3, 4),
(4, ‘電冰箱’, 5, 6),
(5, ‘空調’, 7, 8),
(6, ‘數碼產品’, 10, 19),
(7, ‘電腦’, 11, 18),
(8, ‘台式電腦’, 12, 13),
(9, ‘筆記本電腦’, 14, 15),
(10, ‘平板電腦’, 16, 17);
表結構如下:
下面是PHP的實例代碼:
1、獲取所有節點
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
$stmt = $pdo-prepare(“SELECT c.name FROM product_categories as c, product_categories as pWHERE c.left_node BETWEEN p.left_node AND p.right_nodeAND p.name=’電子產品’ ORDER BY c.left_node”);$stmt-execute();
$rs=$stmt-fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v[‘name’].’br /’;
}
輸出:
電子產品
家用電器
電視機
電冰箱
空調
數碼產品
電腦
台式電腦
筆記本電腦
平板電腦
2、 獲取某個父節點以及其所有子節點
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
$stmt = $pdo-prepare(“SELECT c.name FROM product_categories as c, product_categories as pWHERE c.left_node BETWEEN p.left_node AND p.right_nodeAND p.name=’數碼產品’ ORDER BY c.left_node”);$stmt-execute();
$rs=$stmt-fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v[‘name’].’br /’;
}
輸出:
數碼產品
電腦
台式電腦
筆記本電腦
平板電腦
3、獲取所有的葉子節點
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
$stmt = $pdo-prepare(“SELECT name FROM product_categories where right_node-left_node=1”);$stmt-execute();
$rs=$stmt-fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v[‘name’].’br /’;
}
輸出:
電視機
電冰箱
空調
台式電腦
筆記本電腦
平板電腦
4、獲取某個子節點及其所有父節點
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
$stmt = $pdo-prepare(“SELECT p.name FROM product_categories AS c, product_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node AND c.name = ‘平板電腦’ ORDER BY p.left_node”);$stmt-execute();
$rs=$stmt-fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $v){
echo $v[‘name’].’br /’;
}
輸出:
電子產品
數碼產品
電腦
平板電腦
5、獲取所有節點極其所處的層級
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
$stmt = $pdo-prepare(“SELECT c.name, (COUNT(p.name) – 1) AS level FROM product_categories AS c, product_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node GROUP BY c.name ORDER BY c.left_node”);$stmt-execute();
$rs=$stmt-fetchAll(PDO::FETCH_ASSOC);
var_dump($rs);
echo ‘br /’;
foreach($rs as $v){
echo $v[‘name’].’ level:’.$v[‘level’].’br /’;}
輸出:
電子產品 level:0
家用電器 level:1
電視機 level:2
電冰箱 level:2
空調 level:2
數碼產品 level:2
電腦 level:2
台式電腦 level:3
筆記本電腦 level:3
平板電腦 level:3
6、獲取某個節點的層級
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
$stmt = $pdo-prepare(“SELECT c.name, (COUNT(p.name) – 1) AS level FROM product_categories AS c, product_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node and c.name=’平板電腦’ GROUP BY c.name ORDER BY c.left_node”);$stmt-execute();
$rs=$stmt-fetchAll(PDO::FETCH_ASSOC);
var_dump($rs);
echo ‘br /’;
foreach($rs as $v){
echo $v[‘name’].’ level:’.$v[‘level’].’br /’;}
輸出:
平板電腦 level:3
7、在某個節點後平行的插入一個節點
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
function addNode($left_node,$new_node){
global $pdo;
$stmt = $pdo-prepare(“SELECT right_node FROM product_categories WHERE name = ‘$left_node'”);$stmt-execute();
$rs=$stmt-fetch(PDO::FETCH_ASSOC);
$right_node=$rs[‘right_node’];
$pdo-exec(“UPDATE product_categories SET right_node = right_node + 2 WHERE right_node $right_node”);$pdo-exec(“UPDATE product_categories SET left_node = left_node + 2 WHERE left_node $right_node”);$pdo-exec(“INSERT INTO product_categories(name, left_node, right_node) VALUES(‘$new_node’, $right_node + 1, $right_node + 2)”);}
addNode(‘家用電器’,’辦公用品’);
完成之後表結構如下:
8、刪除某個節點及其所有子節點
?php
$pdo = new PDO(
‘mysql:host=localhost;dbname=test’,
‘root’,
”
);
$pdo-exec(“SET NAMES UTF8”);
function deleteNode($node_name){
global $pdo;
$stmt = $pdo-prepare(“SELECT left_node,right_node, right_node – left_node + 1 as width FROM product_categories WHERE name =’$node_name'”);$stmt-execute();
$rs=$stmt-fetch(PDO::FETCH_ASSOC);
$left_node=$rs[‘left_node’];
$right_node=$rs[‘right_node’];
$width=$rs[‘width’];
$pdo-exec(“DELETE FROM product_categories WHERE left_node BETWEEN $left_node AND $right_node”);$pdo-exec(“UPDATE product_categories SET right_node = right_node – $width WHERE right_node $right_node”);$pdo-exec(“UPDATE product_categories SET left_node = left_node – $width WHERE left_node $right_node”);}
deleteNode(‘數碼產品’);
完成之後表結構如下:
可以看到用多叉樹的方式構建無限分類,查詢的時候是非常簡便的.但是在插入新的節點和刪除節點時就比較麻煩了.
如何用php建立一個樹形結構的類? – PHP進階討論
[php]tid=$tid;? ? ? ? ? ? ? ? $this-tname=$tname;? ? ? ? ? ? ? ? return true;? ? ? ? }? ? ? ? function add($object){? ? ? ? ? ? ? ? $this-tlib[]=$object;? ? ? ? ? ? ? ? return true;? ? ? ? }? ? ? ? function display(){? ? ? ? ? ? ? ? $foreach=array();? ? ? ? ? ? ? ? foreach($this-tlib as $objects){? ? ? ? ? ? ? ? ? ? ? ? $foreach[]=array(? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \’id\’=$objects-tid,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \’name\’=$objects-tname,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \’object\’=($objects-display())? ? ? ? ? ? ? ? ? ? ? ? );? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? return $foreach;? ? ? ? }}$tree = new tree(\”01\”,\”item01\”);$treeSub1 = new tree(\”0101\”,\”item0101\”);$tree-add($treeSub1);$treeSub2 = new Tree(\”0101\”,\”item0101\”);$tree-add($treeSub2);print_r($tree-display());?[/php]
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182987.html