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中for循环语句的几种变型
Nov 26 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &
Feb 09 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
PHP的拦截器实例分析
Nov 03 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
Mar 10 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
PHP单元测试配置与使用方法详解
Dec 27 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扩展图文教程
2008/12/12 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
python数据分析:关键字提取方式
2020/02/24 Python
Python实现井字棋小游戏
2020/03/09 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
python 下载文件的几种方法汇总
2021/01/06 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
财务部总监岗位职责
2014/03/12 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
应届生求职自荐信
2014/07/04 职场文书
加强作风建设心得体会
2014/10/22 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
素质教育培训心得体会
2016/01/19 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android