PHP樹形結(jié)構(gòu)是指在程序中以層疊的方式展現(xiàn)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),通常應(yīng)用于分類、目錄等場景中。從客戶端來看,樹形結(jié)構(gòu)可以方便快速地找到所需的目錄、子目錄或分類,從程序員來看,用PHP樹形結(jié)構(gòu)可以方便地操作數(shù)據(jù)、減少冗余代碼以及提高程序可讀性。
對于數(shù)據(jù)結(jié)構(gòu)來說,樹是一種非常常見的結(jié)構(gòu)類型,而樹形結(jié)構(gòu),最常見的方式是將一個數(shù)據(jù)以及它的所有孩子存儲為一個節(jié)點,具體如下:
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é)點,其子節(jié)點包括文件夾二和文檔3,文件夾二下還有兩個文檔1和2,而文檔3則是以葉子的形式存在。
對于PHP而言,構(gòu)建樹形結(jié)構(gòu)的四個核心步驟如下:
- 定義節(jié)點
- 讀取數(shù)據(jù)到節(jié)點
- 從節(jié)點構(gòu)建樹
- 打印樹形結(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樹形結(jié)構(gòu)的構(gòu)建方法,如果你在實際項目中碰到需要使用樹形結(jié)構(gòu)來展示數(shù)據(jù)的場景,可以按照上面的步驟進行操作。