测试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 无限分类 树形数据 格式化的更多相关文章

  1. js格式化树形数据(扁平化数据)

    需求: 1.把如下数据按照parent_id等于id的规则建立父子关系 2.同一层级的数组按照order升序 [ { "id": 1, "name": &quo ...

  2. 关于无限分类的树状输出(id,name,pid)类型的

    首先创建无限分类的数据表,我这里采用的是id.name.pid这种类型(当然还有很多种无限分类的方式了,比如:id.name.pid.path.left.right左右节点的形式) CREATE TA ...

  3. TreeView递归绑定无限分类数据

    TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...

  4. PHP+Mysql无限分类的方法汇总

    无限分类是个老话题了,来看看PHP结合Mysql如何实现.第一种方法这种方法是很常见.很传统的一种,先看表结构表:categoryid int 主键,自增name varchar 分类名称pid in ...

  5. PHP实现无限分类

    PHP实现无限分类 无限分类 递归 无限级分类是一种设计技巧,在开发中经常使用,例如:网站目录.部门结构.文章分类.笔者觉得它在对于设计表的层级结构上面发挥很大的作用,比如大家在一些平台上面,填写邀请 ...

  6. MySql无限分类数据结构--预排序遍历树算法

    MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...

  7. PHP全路径无限分类原理

    全路径无限分类:以一个字段把他所有的父级id按顺序记录下来以此实现的无限分类叫做全路径无限分类 优点:查询方便 缺点:增加,移动分类时数据维护时稍微复杂.

  8. php三种无限分类

    无限分类,是指从一个最高分类开始,每个子分类都可以分出自己的若干个子分类,可以一直分下去,称为无限级分类: 下面是对省市县的无限极分类的列子.数据库如图: 代码示例如下: /** * @Descrip ...

  9. php无限分类 下拉框

    无限分类 下拉框优势:填写参数少,只需要指定一个循环节点($parnent_id),就可以循环所有下级分类.循环输出结构很有特色,比较符合我的口味.补充: $parent_id才是上下级关联的节点,i ...

随机推荐

  1. Python学习——web框架

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. WSGI(Web Server Gateway Interface)是一种规范,它定义了使用p ...

  2. convert时间格式转换参数表

    本文摘自:http://blog.csdn.net/zc19820620/article/details/2043829 CONVERT (data_type[(length)], expressio ...

  3. swoole深入学习 4. process

    swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...

  4. 解决iframe重复嵌套登陆页面的问题

    在login.jsp中加入即可 // 在被嵌套时就刷新上级窗口 if(window.parent != window){ window.parent.location.reload(true); }

  5. android圆角功能,非常好用,可以用在图片,视频,gif等上面

    使用方式:直接在xml中使用即可. <com.base.baseview.RoundLayout android:id="@+id/example_view" android ...

  6. C#中如何把int转换成两个字符的string

    部门新开了项目,所以一整周的时间都在瞎忙,为什么称瞎忙?所负责的内容,并没有做好,也是一万个心塞啊.... 说一下最近碰到的一些问题. 用到了计时,但是比如定时是一分半钟,可是显示的时候,想让显示为1 ...

  7. 集合(4)—Collection之Set的使用方法

    定义 set接口及其实现类–HashSet Set是元素无序且不可重复的集合,被称为集. HashSet是哈希集,是Set的一个重要实现类 set中循环只能使用foreach和iterator这两个, ...

  8. java知识思维图解

  9. selenium之关于 chromedriver的安装和使用

    转自:https://blog.csdn.net/d77808675/article/details/79016271 最近在学习爬虫,用到了selenium 环境:Windows,python3 但 ...

  10. Windows上的git、github部署及基本使用方法

    1.介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本 ...