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 相关文章推荐
php中session退出登陆问题
Feb 27 PHP
php+ajax实现无刷新分页的方法
Nov 04 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
Mar 19 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
PHP中的正则表达式实例详解
Apr 25 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
thinkPHP5框架接口写法简单示例
Aug 05 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 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 csv操作类代码
2009/12/14 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python连接mongodb密码认证实例
2018/10/16 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
土木工程应届生自荐信
2013/09/24 职场文书
应届生体育教师自荐信
2013/10/03 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
python之基数排序的实现
2021/07/26 Python