php無限樹狀分類查找字段,php樹形結構

本文目錄一覽:

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-hant/n/182987.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 16:25
下一篇 2024-11-24 16:26

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • Python繪製樹狀圖

    本文將從多個方面詳細闡述Python如何繪製樹狀圖。樹狀圖展示了一個層級結構,常用於表示組織結構、家譜、關係圖等。Python作為一種高級編程語言,具有豐富的可視化庫,有許多方法可…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • Navicat導出字段識別為文本而不是數值

    解決方法:使用特定的代碼將導出的字段識別為文本,而不是數值,下面將從多個方面進行詳細闡述。 一、ASCII碼轉換 在導出的文件中,將數值字段使用ASCII碼轉換,即可讓這些字段被識…

    編程 2025-04-28
  • 如何使用Java List根據某一字段升序排序

    本文將詳細介紹在Java中如何使用List集合按照某一字段進行升序排序。具體實現思路如下: 一、定義需要進行排序的Java對象 首先,我們需要定義一個Java對象,該對象包含多個字…

    編程 2025-04-27
  • Lidar避障與AI結構光避障哪個更好?

    簡單回答:Lidar避障適用於需要高精度避障的場景,而AI結構光避障更適用於需要快速響應的場景。 一、Lidar避障 Lidar,即激光雷達,通過激光束掃描環境獲取點雲數據,從而實…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27

發表回復

登錄後才能評論