PHPTree——快速生成無限多級分類

在開發中常常須要用到樹形數據,好比無限多級分類,就是典型的樹形結構。這裏面的算法,用到了遞歸思想,爲了簡化開發過程,我編寫了一個工具來提高開發效率,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也是支持的。

相關文章
相關標籤/搜索