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.ini中的php-5.2.0配置指令详解
Mar 27 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
学习php设计模式 php实现观察者模式(Observer)
Dec 09 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 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
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP实现微信对账单处理
2018/10/01 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
Python实现淘宝秒杀功能的示例代码
2021/01/19 Python
python定义具名元组实例操作
2021/02/28 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
民事答辩状范本
2015/05/21 职场文书
python和anaconda的区别
2022/05/06 Python