請教高手php實現n叉樹遍歷

2021-03-09 13:45:57 字數 4760 閱讀 3908

1樓:龍氏風采

要構建的無限分類的模型. 電子產品是最大的分類.家用電器 ,數碼產品是其子分類.

可以看到子分類是被父分類包含起來的.每個分類都有左右 兩個節點編號分別是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)

輸出:電子產品

家用電器

電視機電冰箱

空調數碼產品

電腦檯式電腦

膝上型電腦

平板電腦

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)

輸出:數碼產品

電腦檯式電腦

膝上型電腦

平板電腦

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)

輸出:電視機

電冰箱空調

臺式電腦

膝上型電腦

平板電腦

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)

輸出:電子產品

數碼產品

電腦平板電腦

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 '

';foreach($rs as $v)

輸出:電子產品 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 '

';foreach($rs as $v)

輸出:平板電腦 level:3

7、在某個節點後平行的插入一個節點

<?php

$pdo = new pdo(

'mysql:host=localhost;dbname=test',

'root',

'');

$pdo->exec("set names utf8");

function addnode($left_node,$new_node)

addnode('家用電器','辦公用品');

完成之後表結構如下:

8、刪除某個節點及其所有子節點

<?php

$pdo = new pdo(

'mysql:host=localhost;dbname=test',

'root',

'');

$pdo->exec("set names utf8");

function deletenode($node_name)

deletenode('數碼產品');

完成之後表結構如下:

可以看到用多叉樹的方式構建無限分類,查詢的時候是非常簡便的.但是在插入新的節點和刪除節點時就比較麻煩了.

2樓:山東文匯軟體

樹狀圖?還是放射線的那種,你倒是截個圖說明白點啊

請教Excel高手,這個查詢資料問題怎實現

b2單元格輸入公式 iferror vlookup a2,d e,2,0 b1 下拉填充即可 如果出現問題,可以加510809100幫你遠端協助解決 如果沒有相同的時刻,則取上一時刻已經查到的b值 這一句沒怎麼明白。從截圖上看,10 08 10 33,只有10 08有對應的e值。那10 09 10 ...

php實現網路爬蟲,如何用php 編寫網路爬蟲

提供給你我之前寫的類 curl.php 希望可以幫到你.querylist.php和phpquery.php由於檔案太大了,沒辦法貼上來 php可以寫網頁爬蟲嗎 幾乎任何語言都能寫爬蟲,原理也都一樣,http 協議抓網頁內容,按照需求程度不同,可能還要抓響應碼 cookies header然後自行處...

php如何實現將頁面分成幾個模組

首先說佈局div css 橫向三個div,左邊左浮動,右邊的右浮動。然後右邊的div內放置兩個div 上下結構 上下div裡各有兩個div,分別左右浮動。再說php檔案 如果是程序導向的話,直接把頁面寫成.php字尾,頁面中直接寫入php 用echo輸出。如果是物件導向的話,就需要使用模板引擎,將p...