php 无限分类实现 layui tree
最近做一个东西,要用到树形菜单。之前一直用的是ztree,于是想换个插件用用。于是就在寻找好用的插件。之前一直关注layui项目,现在layui也已经发布了,http://www.layui.com/项目地址,大家感兴趣的可以了解一下。
其中的一个插件就是 tree插件,我们称之为 layui-tree吧。
还是挺美观的,那我们就看看,怎么实现这个tree吧。
1 layui.use('tree', function(){ 2 var tree = layui.tree({ 3 elem: '#demo' //指定元素 4 //,check: 'checkbox' //勾选风格 5 ,skin: 'as' //设定皮肤 6 //,target: '_blank' //是否新选项卡打开(比如节点返回href才有效) 7 ,drag: true 8 ,click: function(item){ //点击节点回调 9 console.log(item) 10 } 11 ,nodes: nodes //这里传入指定的nodes数据即可 12 }); 13 14 });
那这里面的nodes数据是什么样子呢?官网也有给定的格式。
1 [ //节点 2 { 3 name: '常用文件夹' 4 ,id: 1 5 ,alias: 'changyong' 6 ,children: [ 7 { 8 name: '所有未读' 9 ,id: 11 10 ,href: 'http://www.layui.com/' 11 ,alias: 'weidu' 12 }, { 13 name: '置顶邮件' 14 ,id: 12 15 }, { 16 name: '标签邮件' 17 ,id: 13 18 } 19 ] 20 }, { 21 name: '我的邮箱' 22 ,id: 2 23 ,spread: true 24 ,children: [ 25 { 26 name: 'QQ邮箱' 27 ,id: 21 28 ,spread: true 29 ,children: [ 30 { 31 name: '收件箱' 32 ,id: 211 33 ,children: [ 34 { 35 name: '所有未读' 36 ,id: 2111 37 }, { 38 name: '置顶邮件' 39 ,id: 2112 40 }, { 41 name: '标签邮件' 42 ,id: 2113 43 } 44 ] 45 }, { 46 name: '已发出的邮件' 47 ,id: 212 48 }, { 49 name: '垃圾邮件' 50 ,id: 213 51 } 52 ] 53 }, { 54 name: '阿里云邮' 55 ,id: 22 56 ,children: [ 57 { 58 name: '收件箱' 59 ,id: 221 60 }, { 61 name: '已发出的邮件' 62 ,id: 222 63 }, { 64 name: '垃圾邮件' 65 ,id: 223 66 } 67 ] 68 } 69 ] 70 } 71 ]
格式就是子孙的节点,放到父节点的children下,那php怎么将存入数据库的数据整理成这个样子呢?第一次想到的就是利用递归完成子孙树,但是简单的递归很难加入children这个子节点。下面介绍一下,我怎么来处理:
处理数据程序 data.php
1 <?php 2 3 $data = [ 4 [ 'id' => 1, 'name' => '江苏省', 'pid' => 0], 5 [ 'id' => 2, 'name' => '徐州市', 'pid' => 1], 6 [ 'id' => 3, 'name' => '睢宁县', 'pid' => 2], 7 [ 'id' => 4, 'name' => '双沟镇', 'pid' => 3], 8 [ 'id' => 5, 'name' => '王集镇', 'pid' => 3], 9 [ 'id' => 6, 'name' => '铜山区', 'pid' => 2], 10 [ 'id' => 7, 'name' => '张集镇', 'pid' => 6], 11 [ 'id' => 8, 'name' => '大黄山镇', 'pid' => 6], 12 [ 'id' => 9, 'name' => '南京市', 'pid' => 1], 13 [ 'id' => 10, 'name' => '江宁区', 'pid' => 9], 14 [ 'id' => 11, 'name' => '鼓楼区', 'pid' => 9], 15 [ 'id' => 12, 'name' => '浙江省', 'pid' => 0], 16 [ 'id' => 13, 'name' => '杭州市', 'pid' => 12], 17 [ 'id' => 14, 'name' => '西湖区', 'pid' => 13] 18 ]; 19 20 $res = []; 21 $tree = []; 22 23 //整理数组 24 foreach( $data as $key=>$vo ){ 25 $res[$vo['id']] = $vo; 26 $res[$vo['id']]['children'] = []; 27 } 28 unset( $data ); 29 30 //查询子孙 31 foreach( $res as $key=>$vo ){ 32 if( $vo['pid'] != 0 ){ 33 $res[$vo['pid']]['children'][] = &$res[$key]; 34 } 35 } 36 37 //去除杂质 38 foreach( $res as $key=>$vo ){ 39 if( $vo['pid'] == 0 ){ 40 $tree[] = $vo; 41 } 42 } 43 unset( $res ); 44 45 $tree = json_encode( $tree );
注意 33 行的 &$tree[$key] 这句话。这个是一次循环实现无限极分类的关键所在。以地址的形式操作数组。不理解的可以分开打印怎么实现的。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 6 <title>树模块 - layui</title> 7 <link rel="stylesheet" href="./layui/css/layui.css"> 8 <style> 9 body{padding: 50px 100px;} 10 </style> 11 </head> 12 <body> 13 <?php require 'data.php'; ?> 14 15 <ul id="demo"></ul> 16 17 <script src="./layui/layui.js"></script> 18 <script> 19 20 layui.use('tree', function(){ 21 var tree = layui.tree({ 22 elem: '#demo' //指定元素 23 //,check: 'checkbox' //勾选风格 24 ,skin: 'as' //设定皮肤 25 //,target: '_blank' //是否新选项卡打开(比如节点返回href才有效) 26 ,drag: true 27 ,click: function(item){ //点击节点回调 28 console.log(item) 29 } 30 ,nodes: <?php echo $tree; ?> 31 }); 32 33 }); 34 </script> 35 </body> 36 </html>
下载好layui按照你自己的文件位置放好就行了。显示效果如下:
声明:本文内容仅是本人学习的记录,不保证在项目中可用,若引用此代码导致了严重后果,本人不承担任何法律责任。