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 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
PHP入门教程之图像处理技巧分析
Sep 11 PHP
php socket通信简单实现
Nov 18 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
PHP基于进程控制函数实现多线程
Dec 09 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解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP钩子实现方法解析
2019/05/21 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
python数据结构树和二叉树简介
2014/04/29 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python多线程实现同步的四种方式
2017/05/02 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Django stark组件使用及原理详解
2019/08/22 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
python中round函数保留两位小数的方法
2020/12/04 Python
密封类可以有虚函数吗
2014/08/11 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
于丹论语心得观后感
2015/06/15 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书