> 在開發中經常需要用到樹形數據,比如無限多級分類,就是典型的樹形結構。
```
//原始數據, 從數據庫讀出
$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 = common_Tree::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
????????}
]
```
如果不需要使用前端框架,只是用HTML輸出,可以使用下面的方法:
~~~
$r?=?common_Tree::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>';
```
演示

> 關于數據庫的設計,只需要保證包含 id 和 parent_id 字段即可,其他字段可以自行添加,不會影響數據生成。parent_id是父級ID,如果是一級分類,就設為 0 。當然,字段也是可以配置的。
>
> 請繼續往下看,我將介紹一些進階的使用方法。
展開子節點:
~~~
common_Tree::makeTree(?$data,?array(
????'expanded'?=>?true
));
~~~
輸出的數據為:
~~~
[
????????{
????????????id:1,
????????????name:'book1',
????????????expanded:true,//展開子節點
????????????children:[
????????????????...
????????????]
????????}
]
~~~
自定義主鍵和父鍵:
~~~
//數據庫讀出
$data?=?array(
????array(
????????'order_id'=>1,?//主鍵
????????'name'=>'book1',
????????'pid'=>0,?//父鍵
????????...
????)
);
common_Tree::makeTree(?$data,?array(
????'primary_key'?=>?'order_id',
????'parent_key'??=>?'pid'
));
~~~
輸出的數據為:
~~~
[
????????{
????????????order_id:1,
????????????name:'book1',
????????????pid:0,
????????????...
????????}
]
~~~
makeTreeForHtml 方法也支持配置主鍵和父鍵。
還有其他字段也可以自定義,但下面這些參數僅支持 makeTree 方法:
~~~
$r?=?common_Tree::makeTree($data,?array(
????'expanded_key'?=>?'expanded',
????'children_key'?=>?'children',
????'leaf_key'?????=>?'leaf'
));
~~~