在開發中常常須要用到樹形數據,好比無限多級分類,就是典型的樹形結構。這裏面的算法,用到了遞歸思想,爲了簡化開發過程,我編寫了一個工具來提高開發效率,php
它就是PHPTree。前端
git地址:https://git.oschina.net/jiusem/PHPTree.gitgit
最簡單的例子:算法
<?php require('PHPTree.class.php'); //原始數據, 從數據庫讀出 $data = array( array( 'id'=>1, 'name'=>'book', 'parent_id'=>0 ), array( 'id'=>2, 'name'=>'music', 'parent_id'=>0 ), array( 'id'=>3, 'name'=>'book1', 'parent_id'=>1 ), array( 'id'=>4, 'name'=>'book2', 'parent_id'=>3 ) ); $r = PHPTree::makeTree($data); echo json_encode($r); ?>
輸出:數據庫
[ { "id": 1, "name": "book", "parent_id": 0, "expanded": false, //不展開子節點 "children": [ { "id": 3, "name": "book1", "parent_id": 1, "expanded": false, "children": [ { "id": 4, "name": "book2", "parent_id": 3, "leaf": true } ] } ] }, { "id": 2, "name": "music", "parent_id": 0, "leaf": true } ]
生成的數據就是樹形結構了,能夠結合ExtJS等前端框架來使用了。git中包含了一個ExtJS的demo,你們能夠參考。json
演示:數組
若是不須要使用前端框架,只是用HTML輸出,能夠使用下面的方法:前端框架
$r = PHPTree::makeTreeForHtml($data);
獲得一個一維數組,用 level 字段來標識分類的層次:框架
array( array( 'id'=>1, 'name'=>'用戶管理', 'parent_id'=>0, 'level'=>0 //一級分類 ), array( 'id'=>1, 'name'=>'用戶列表', 'parent_id'=>1, 'level'=>1 //二級分類 ) .... );
輸出爲select標籤:工具
echo '<h1>PHPTree樹形結構</h1>'; echo '<select style="width:300px;">'; foreach($r as $item){ echo '<option>'; //根據所在的層次縮進 echo str_repeat('......',$item['level']); echo $item['name']; echo '</option>'; } echo '</select>';
演示:
git中包含了一個輸出HTML的demo,你們能夠參考。
關於數據庫的設計,只須要保證包含 id 和 parent_id 字段便可,其餘字段能夠自行添加,不會影響數據生成。parent_id是父級ID,若是是一級分類,就設爲 0 。固然,字段也是能夠配置的。請繼續往下看,我將介紹一些進階的使用方法。
展開子節點:
PHPTree::makeTree( $data, array( 'expanded' => true ));
輸出的數據爲:
[ { id:1, name:'book1', expanded:true,//展開子節點 children:[ ... ] } ]
自定義主鍵和父鍵:
//數據庫讀出 $data = array( array( 'order_id'=>1, //主鍵 'name'=>'book1', 'pid'=>0, //父鍵 ... ) ); PHPTree::makeTree( $data, array( 'primary_key' => 'order_id', 'parent_key' => 'pid' ));
輸出的數據爲:
[ { order_id:1, name:'book1', pid:0, ... } ]
makeTreeForHtml 方法也支持配置主鍵和父鍵。
還有其餘字段也能夠自定義,但下面這些參數僅支持 makeTree 方法:
$r = PHPTree::makeTree($data, array( 'expanded_key' => 'expanded', 'children_key' => 'children', 'leaf_key' => 'leaf' ));
默認,這些字段的配置都是以ExtJS爲參考的,若是你使用zTree框架的話,這些字段就須要從新配置了。
zTree 是一款強大的國產樹形框架,它還支持 簡單JSON格式,是一維數據格式,實際上就不須要用到PHPTree了。固然,PHPTree輸出的數據層次感清晰,zTree也是支持的。