php只查询一次数据库分类表,实现无限极分类
2017-01-17 16:07
483 查看
数据库中字段和记录展示
前端效果展示
javascript写法:
总结:要点就是使用对象的引用
$db = new Mysql(); $sql = 'select id,pid,name from test order by pid asc'; $result = $db->select($sql); $result1 = $result;
$result 查询出来的数据格式 Array ( [0] => Array ( [id] => 67 [pid] => 0 [name] => 系统设置 ) [1] => Array ( [id] => 76 [pid] => 0 [name] => 其他设置 ) [2] => Array ( [id] => 73 [pid] => 0 [name] => 用户管理 ) [3] => Array ( [id] => 72 [pid] => 67 [name] => 导航 管理 ) [4] => Array ( [id] => 71 [pid] => 67 [name] => 菜单管理 ) ... )
$maxNum = 1000;//设置最大循环次数 $count = -1;//设置计数 //默认根节点内容 $root = array( 'id' => '0', 'text' => 'root', ); //辅助,主要作用用于检测节点是否存在 //注:下面使用的技巧都是使用对象的引用,赋值的不是一个具体值,而是一个引用 $existsMap = array( '0' => &$root, ); //结果记录的长度 $len = count($result1); //计数 $num = 0; //遍历结果集 while ($num < $len) { $count++; //如果计数器超过了最大循环次数就退出循环 if ($count > $maxNum) break; $i = $count % $len;//取得下标,取莫的作用是防止下标超出边界 $obj = $result[$i];//取得当前节点 if (!$obj) continue;//不存在则跳过 $pidObj = & $existsMap[$obj['pid']];//检测辅助数组中是否有父节点数据并赋引用值给pidObj if (!$pidObj) continue; //如果存在pidObj,则设置当前节点在existsMap中 $existsMap[$obj['id']] = array( 'id' => $obj['id'], 'text' => $obj['name'], ); //设置子节点 if (!$pidObj['children']) { $pidObj['children'] = array(); } //设置子节点为刚刚存在辅助数组中得引用 $pidObj['children'][] = & $existsMap[$obj['id']]; unset($result[$i]); $num++; } //根据自己的需求,决定是否返回root节点 return $root['children'];
输出$root结果: Array ( [id] => 0 [text] => root [children] => Array ( [0] => Array ( [id] => 67 [text] => 系统设置 [children] => Array ( [0] => Array ( [id] => 72 [text] => 导航 管理 ) [1] => Array ( [id] => 71 [text] => 菜单管理 ) [2] => Array ( [id] => 70 [text] => 配置管理 ) [3] => Array ( [id] => 69 [text] => 模型管理 ) [4] => Array ( [id] => 68 [text] => 分类设置 ) ) ) [1] => Array ( [id] => 76 [text] => 其他设置 [children] => Array ( [0] => Array ( [id] => 78 [text] => 其他设置2 ) [1] => Array ( [id] => 77 [text] => 其他设置1 [children] => Array ( [0] => Array ( [id] => 79 [text] => 其他设置1-1 [children] => Array ( [0] => Array ( [id] => 81 [text] => 其他设置1-1-1 [children] => Array ( [0] => Array ( [id] => 82 [text] => 其他设置1-1-1-1 [children] => Array ( [0] => Array ( [id] => 87 [text] => 其他设置1-1-1-1-3 ) [1] => Array ( [id] => 65 [text] => 其他设置1-1-1-1-2 ) [2] => Array ( [id] => 83 [text] => 其他设置1-1-1-1-1 ) [3] => Array ( [id] => 88 [text] => 其他设置1-1-1-1-4 ) ) ) ) ) ) ) [1] => Array ( [id] => 80 [text] => 其他设置1-2 [children] => Array ( [0] => Array ( [id] => 84 [text] => 其他设置1-2-1 ) [1] => Array ( [id] => 85 [text] => 其他设置1-2-2 ) ) ) ) ) ) ) [2] => Array ( [id] => 73 [text] => 用户管理 [children] => Array ( [0] => Array ( [id] => 74 [text] => 用户列表 ) [1] => Array ( [id] => 75 [text] => 权限分配 ) ) ) ) )
前端效果展示
javascript写法:
var list = [{"id":"67","pid":"0","name":"\u7cfb\u7edf\u8bbe\u7f6e"},{"id":"76","pid":"0","name":"\u5176\u4ed6\u8bbe\u7f6e"},{"id":"73","pid":"0","name":"\u7528\u6237\u7ba1\u7406"},{"id":"72","pid":"67","name":"\u5bfc\u822a \u7ba1\u7406"},{"id":"71","pid":"67","name":"\u83dc\u5355\u7ba1\u7406"},{"id":"70","pid":"67","name":"\u914d\u7f6e\u7ba1\u7406"},{"id":"69","pid":"67","name":"\u6a21\u578b\u7ba1\u7406"},{"id":"68","pid":"67","name":"\u5206\u7c7b\u8bbe\u7f6e"},{"id":"74","pid":"73","name":"\u7528\u6237\u5217\u8868"},{"id":"75","pid":"73","name":"\u6743\u9650\u5206\u914d"},{"id":"78","pid":"76","name":"\u5176\u4ed6\u8bbe\u7f6e2"},{"id":"77","pid":"76","name":"\u5176\u4ed6\u8bbe\u7f6e1"},{"id":"79","pid":"77","name":"\u5176\u4ed6\u8bbe\u7f6e1-1"},{"id":"80","pid":"77","name":"\u5176\u4ed6\u8bbe\u7f6e1-2"},{"id":"81","pid":"79","name":"\u5176\u4ed6\u8bbe\u7f6e1-1-1"},{"id":"84","pid":"80","name":"\u5176\u4ed6\u8bbe\u7f6e1-2-1"},{"id":"85","pid":"80","name":"\u5176\u4ed6\u8bbe\u7f6e1-2-2"},{"id":"82","pid":"81","name":"\u5176\u4ed6\u8bbe\u7f6e1-1-1-1"},{"id":"87","pid":"82","name":"\u5176\u4ed6\u8bbe\u7f6e1-1-1-1-3"},{"id":"65","pid":"82","name":"\u5176\u4ed6\u8bbe\u7f6e1-1-1-1-2"},{"id":"83","pid":"82","name":"\u5176\u4ed6\u8bbe\u7f6e1-1-1-1-1"},{"id":"88","pid":"82","name":"\u5176\u4ed6\u8bbe\u7f6e1-1-1-1-4"}]; var maxNum = 1000; var count = -1; var root = {id:"0", text:"root"}; var existsMap = {"0":root}; var len = list.length; var num = 0; while(num < len) { count ++; if(maxNum < count) { break; } var i = count % len; var obj = list[i]; if(obj == -1) { continue; } var pidObj = existsMap[obj.pid]; if(pidObj == null) { continue; } var treeNode = {id:obj.id, text:obj.name}; existsMap[obj.id] = treeNode; if(pidObj['children'] == null) { pidObj['children'] = []; } pidObj['children'].push(treeNode); list[i] = -1; num ++; } console.log(root)
总结:要点就是使用对象的引用
相关文章推荐
- PHP查询数据库中满足条件的记录条数(两种实现方法)
- 无限极分类php实现—查子孙树、家谱树
- PHP查询数据库中满足条件的记录条数(二种实现方法)
- php实现smarty模板无限极分类的方法
- PHP递归实现无限极分类
- php无限极分类实现的两种解决方法
- PHP中XPATH 实现xml及html文件快速解析(附xml做小型数据库实现六级单词快速查询实例)
- php实现无限极分类
- php简单实现查询数据库返回json数据
- php实现smarty模板无限极分类的方法
- php+mysql实现的无限极分类
- PHP实现无限极分类图文教程
- 用PHP去实现数据库查询结果缓存
- PHP 实现无限极栏目分类
- c#一次数据库查询,JS实现内容分页
- 利用JS+表单+php实现组装式数据查询,类似于数据库的UI
- PHP连接MYSQL实现简单的无限极分类
- php无限极分类递归排序实现方法
- 用PHP去实现数据库查询结果缓存
- php 无限极分类实现