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 和 XML: 使用expat函数(三)
Oct 09 PHP
dedecms模版制作使用方法
Apr 03 PHP
php5 图片验证码实现代码
Dec 11 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
从PHP的源码中深入了解stdClass类
Apr 18 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
php输入数据统一类实例
Feb 23 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
php使用pecl方式安装扩展操作示例
Aug 12 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程序之die调试法 快速解决错误
2009/09/17 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
php 多文件上传的实现实例
2016/10/23 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
Python实用日期时间处理方法汇总
2015/05/09 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
西部世纪.net笔试题面试题
2014/04/03 面试题
《这儿真好》教学反思
2014/02/22 职场文书
股东协议书
2014/04/14 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
医药销售自我评价200字
2014/09/11 职场文书
学生检讨书怎么写
2014/10/09 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫