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实现二分查找算法代码分享
Jun 24 PHP
检查php文件中是否含有bom的函数
May 31 PHP
基于php 随机数的深入理解
Jun 05 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
php将access数据库转换到mysql数据库的方法
Dec 24 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
Apache PHP MySql安装配置图文教程
Aug 27 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
PHP7数组的底层实现示例
Aug 25 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日期处理函数 整型日期格式
2011/01/12 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
详解爬虫被封的问题
2019/04/23 Python
Django组件cookie与session的具体使用
2019/06/05 Python
python3爬虫中异步协程的用法
2020/07/10 Python
python搜索算法原理及实例讲解
2020/11/18 Python
金融专业毕业生推荐信
2013/11/26 职场文书
小学一年级评语大全
2014/04/22 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
2015年财务部工作总结
2015/04/10 职场文书
二审代理词范文
2015/05/25 职场文书
创业计划书之干洗店
2019/09/10 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js