企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> 在开发中经常需要用到树形数据,比如无限多级分类,就是典型的树形结构。 ``` //原始数据, 从数据库读出 $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>'; ``` 演示 ![](https://box.kancloud.cn/d3b68f2062fab9154a8e1f198f7333fa_349x208.png) > 关于数据库的设计,只需要保证包含 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' )); ~~~