php 无限分类 树形数据 格式化
测试demo
------------------------------------------------------------------------------------
<?php
function genTree($items,$id='id',$pid='pid',$son = 'children'){
$tree = array(); //格式化的树
$tmpMap = array(); //临时扁平数据 foreach ($items as $item) {
$tmpMap[$item[$id]] = $item;
} foreach ($items as $item) {
if (isset($tmpMap[$item[$pid]])) {
$tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];
} else {
$tree[] = &$tmpMap[$item[$id]];
}
}
unset($tmpMap);
return $tree;
} $items1 = array(
array('id' => 1, 'pid' => 0, 'name' => '一级11' ),
array('id' => 11, 'pid' => 0, 'name' => '一级12' ),
array('id' => 2, 'pid' => 1, 'name' => '二级21' ),
array('id' => 10, 'pid' => 11, 'name' => '二级22' ),
array('id' => 3, 'pid' => 1, 'name' => '二级23' ),
array('id' => 12, 'pid' => 11, 'name' => '二级24' ),
array('id' => 9, 'pid' => 1, 'name' => '二级25' ),
array('id' => 14, 'pid' => 1, 'name' => '二级26' ),
array('id' => 4, 'pid' => 9, 'name' => '三级31' ),
array('id' => 6, 'pid' => 9, 'name' => '三级32' ),
array('id' => 7, 'pid' => 4, 'name' => '四级41' ),
array('id' => 8, 'pid' => 4, 'name' => '四级42' ),
array('id' => 5, 'pid' => 4, 'name' => '四级43' ),
array('id' => 13, 'pid' => 4, 'name' => '四级44' ),
array('id' => 15, 'pid' => 8, 'name' => '五级51' ),
array('id' => 16, 'pid' => 8, 'name' => '五级52' ),
array('id' => 17, 'pid' => 8, 'name' => '五级53' ),
array('id' => 18, 'pid' => 16, 'name' => '六级64' ),
); $time1 = microtime(true);
var_dump(genTree($items1));
$time2 = microtime(true);
echo "function 时间1:".($time2-$time1);
?>
------------------------------------------------------------------------ 整合TP框架
------------------------------------------------------------- 控制器端:
// 先取出所有的权限
$priModel = D('Privilege');
$data = $priModel->priTree();
$arr = $priModel->genTree($data);
模型端代码:
public function priTree(){
$data = $this->select();
return $this->_reSort($data);
}
#递归对有的分类进行重新排序
public function _reSort($data, $parent_id=0, $level=0){
static $ret = array();
foreach ($data as $k => $v){
if($v['parent_id'] == $parent_id){
// 把level值放到这个分类里,这样就可以知道这个分类是第几级的
$v['level'] = $level;
$ret[] = $v;
// 再找这个分类的子分类
$this->_reSort($data, $v['id'], $level+1);
}
}
return $ret;
}
#获取树形结果
public function genTree($items,$id='id',$pid='parent_id',$son = 'children'){
$tree = array(); //格式化的树
$tmpMap = array(); //临时保存数据
foreach ($items as $item) {
$tmpMap[$item[$id]] = $item;
foreach ($items as $item) {
if (isset($tmpMap[$item[$pid]])) {
$tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];
} else {
$tree[] = &$tmpMap[$item[$id]];
}
}
unset($tmpMap);
return $tree;
}
php 无限分类 树形数据 格式化的更多相关文章
- js格式化树形数据(扁平化数据)
需求: 1.把如下数据按照parent_id等于id的规则建立父子关系 2.同一层级的数组按照order升序 [ { "id": 1, "name": &quo ...
- 关于无限分类的树状输出(id,name,pid)类型的
首先创建无限分类的数据表,我这里采用的是id.name.pid这种类型(当然还有很多种无限分类的方式了,比如:id.name.pid.path.left.right左右节点的形式) CREATE TA ...
- TreeView递归绑定无限分类数据
TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...
- PHP+Mysql无限分类的方法汇总
无限分类是个老话题了,来看看PHP结合Mysql如何实现.第一种方法这种方法是很常见.很传统的一种,先看表结构表:categoryid int 主键,自增name varchar 分类名称pid in ...
- PHP实现无限分类
PHP实现无限分类 无限分类 递归 无限级分类是一种设计技巧,在开发中经常使用,例如:网站目录.部门结构.文章分类.笔者觉得它在对于设计表的层级结构上面发挥很大的作用,比如大家在一些平台上面,填写邀请 ...
- MySql无限分类数据结构--预排序遍历树算法
MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...
- PHP全路径无限分类原理
全路径无限分类:以一个字段把他所有的父级id按顺序记录下来以此实现的无限分类叫做全路径无限分类 优点:查询方便 缺点:增加,移动分类时数据维护时稍微复杂.
- php三种无限分类
无限分类,是指从一个最高分类开始,每个子分类都可以分出自己的若干个子分类,可以一直分下去,称为无限级分类: 下面是对省市县的无限极分类的列子.数据库如图: 代码示例如下: /** * @Descrip ...
- php无限分类 下拉框
无限分类 下拉框优势:填写参数少,只需要指定一个循环节点($parnent_id),就可以循环所有下级分类.循环输出结构很有特色,比较符合我的口味.补充: $parent_id才是上下级关联的节点,i ...
随机推荐
- VB.NET 编程元素支持更改总结
Visual Basic 2005 更改了它支持各种编程元素的方式,主要是为了提供与公共语言运行库的互操作性.许多 Visual Basic 6.0 元素被重新命名,重新分类或与 Visual Bas ...
- 漫谈可视化Prefuse(五)
伴随着前期的基础积累,翻过API,读过一些Demo,总觉得自己已经摸透了Prefuse,小打小闹似乎已经无法满足内心膨胀的自己.还记得儿时看的<武状元苏乞儿>中降龙十八掌最后一张居然是空白 ...
- CPU HQ 什么意思
CPU HQ 什么意思 High performance graphics, quad core 高性能图形,四核 参见:https://www.intel.cn/content/www/cn/zh/ ...
- [NOIp2015提高组]信息传递
OJ题号:洛谷2661 思路:求最小环.DFS+记忆化. #include<cstdio> #include<cstring> #include<algorithm> ...
- Spring中 @Autowired标签与 @Resource标签 的区别(转)
Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowi ...
- android:ProgressDialog控件
ProgressDialog 和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽 掉其他控件的交互能力.不同的是,ProgressDialog 会在对话框中显示一个进度条, ...
- WordPress主题开发:输出指定页面导航
实例: <ul> <li class="widget widget_nav_menu"> <?php if(is_page(array(12,14,1 ...
- Map和String类型之间的转换
前提是String的格式是map或json类型的 public static void main(String[] args) { Map<String,Object> map = new ...
- windows命令行下杀死进程的方法
xp和win7下有两个好东东tasklist和tskill.tasklist能列出所有的进程,和相应的信息.tskill能查杀进程,语法很简单:tskill程序名!或者是tskill 进程id 例如: ...
- C++并发编程 条件变量 condition_variable,线程安全队列示例
1. 背景 c++11中提供了对线程与条件变量的更好支持,对于写多线程程序方便了很多. 再看c++并发编程,记一下学习笔记. 2. c++11 提供的相关api 3.1 wait wait用于无条件等 ...