PHP从二维数组得到N层分类树的实现代码


Posted in PHP onOctober 11, 2016

公司的产品分类存在一张表内,以mid标识其父分类,需要得到有层次结构的数组,以备后续操作。

想了下,想了一会儿没想出不去重复读取数据库的方法或者不需要递归的操作。

数据源:(数据要求一维key与对应value二维数组的id要一样)

$items = array(
    1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),
    2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'),
    3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),
    4 => array('id' => 4, 'pid' => 2, 'name' => '哈尔滨市'),
    5 => array('id' => 5, 'pid' => 2, 'name' => '鸡西市'),
    6 => array('id' => 6, 'pid' => 4, 'name' => '香坊区'),
    7 => array('id' => 7, 'pid' => 4, 'name' => '南岗区'),
    8 => array('id' => 8, 'pid' => 6, 'name' => '和兴路'),
    9 => array('id' => 9, 'pid' => 7, 'name' => '西大直街'),
    10 => array('id' => 10, 'pid' => 8, 'name' => '东北林业大学'),
    11 => array('id' => 11, 'pid' => 9, 'name' => '哈尔滨工业大学'),
    12 => array('id' => 12, 'pid' => 8, 'name' => '哈尔滨师范大学'),
    13 => array('id' => 13, 'pid' => 1, 'name' => '赣州市'),
    14 => array('id' => 14, 'pid' => 13, 'name' => '赣县'),
    15 => array('id' => 15, 'pid' => 13, 'name' => '于都县'),
    16 => array('id' => 16, 'pid' => 14, 'name' => '茅店镇'),
    17 => array('id' => 17, 'pid' => 14, 'name' => '大田乡'),
    18 => array('id' => 18, 'pid' => 16, 'name' => '义源村'),
    19 => array('id' => 19, 'pid' => 16, 'name' => '上坝村'),
);

生成树的函数:

function genTree9($items) {
    $tree = array();
    foreach ($items as $item)
        if (isset($items[$item['pid']]))
            $items[$item['pid']]['son'][] = &$items[$item['id']];
        else
            $tree[] = &$items[$item['id']];
    return $tree;
}

当然。满足特定条件下的数据,更是可以把函数缩到只有短短5行:

function genTree5($items) {
    foreach ($items as $item)
        $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
    return isset($items[0]['son']) ? $items[0]['son'] : array();
}

一遍循环,内存引用。省时又省空间。

PHP 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
PHP读取目录下所有文件的代码
Jan 07 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
php将数据库导出成excel的方法
May 07 PHP
第二章 PHP入门基础之php代码写法
Dec 30 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
PHP常用正则表达式集锦
Aug 17 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
PHP实现的mysql读写分离操作示例
May 22 PHP
php 无限分类 树形数据格式化代码
Oct 11 #PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 #PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 #PHP
php外部执行命令函数用法小结
Oct 11 #PHP
php字符串操作常见问题小结
Oct 11 #PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 #PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 #PHP
You might like
将PHP作为Shell脚本语言使用
2006/10/09 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
原生js实现轮播图
2017/02/27 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
python中时间模块的基本使用教程
2019/05/14 Python
创建Django项目图文实例详解
2019/06/06 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Python高并发和多线程有什么关系
2020/11/14 Python
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
销售督导岗位职责
2015/04/10 职场文书