PHP樹(shù)形結(jié)構(gòu)是指在程序中以層疊的方式展現(xiàn)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),通常應(yīng)用于分類(lèi)、目錄等場(chǎng)景中。從客戶端來(lái)看,樹(shù)形結(jié)構(gòu)可以方便快速地找到所需的目錄、子目錄或分類(lèi),從程序員來(lái)看,用PHP樹(shù)形結(jié)構(gòu)可以方便地操作數(shù)據(jù)、減少冗余代碼以及提高程序可讀性。
對(duì)于數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),樹(shù)是一種非常常見(jiàn)的結(jié)構(gòu)類(lèi)型,而樹(shù)形結(jié)構(gòu),最常見(jiàn)的方式是將一個(gè)數(shù)據(jù)以及它的所有孩子存儲(chǔ)為一個(gè)節(jié)點(diǎn),具體如下:
array( 'id' =>1, 'name' =>'文件夾一', 'children' =>array( array( 'id' =>2, 'name' =>'文件夾二', 'children' =>array( array( 'id' =>3, 'name' =>'文檔1.docx' ), array( 'id' =>4, 'name' =>'文檔2.txt' ) ) ), array( 'id' =>5, 'name' =>'文檔3.pdf' ) ) );
在上面的例子中,文件夾一作為節(jié)點(diǎn),其子節(jié)點(diǎn)包括文件夾二和文檔3,文件夾二下還有兩個(gè)文檔1和2,而文檔3則是以葉子的形式存在。
對(duì)于PHP而言,構(gòu)建樹(shù)形結(jié)構(gòu)的四個(gè)核心步驟如下:
- 定義節(jié)點(diǎn)
- 讀取數(shù)據(jù)到節(jié)點(diǎn)
- 從節(jié)點(diǎn)構(gòu)建樹(shù)
- 打印樹(shù)形結(jié)構(gòu)
class Node { public $id; public $name; public $children = array(); }
function read($data) { $node = new Node; $node->id = $data['id']; $node->name = $data['name']; if(isset($data['children'])) { foreach($data['children'] as $child) { $node->children[] = read($child); } } return $node; }
function build($nodes) { $map = array(); foreach($nodes as $node) { $map[$node->id] = $node; } $root = null; foreach($nodes as $node) { if(!isset($map[$node->parentId])) { $root = $node; continue; } $parent = $map[$node->parentId]; $parent->children[] = $node; } return $root; }
function printTree($node, $indent = 0) { echo str_repeat(' ', $indent) . $node->name . "\n"; foreach($node->children as $child) { printTree($child, $indent + 2); } }
以上便是PHP樹(shù)形結(jié)構(gòu)的構(gòu)建方法,如果你在實(shí)際項(xiàng)目中碰到需要使用樹(shù)形結(jié)構(gòu)來(lái)展示數(shù)據(jù)的場(chǎng)景,可以按照上面的步驟進(jìn)行操作。