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&&mysql)五
Oct 09 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
CURL的学习和应用(附多线程实现)
Jun 03 PHP
php多文件上传下载示例分享
Feb 20 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 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 用sock技术发送邮件的函数
2007/07/21 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python线程之定位与销毁的实现
2019/02/17 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
校运会广播稿100字
2014/01/27 职场文书
员工升职自荐信
2015/03/27 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
技术入股合作协议书
2016/03/21 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
Golang并发工具Singleflight
2022/05/06 Golang