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的计数器程序
Oct 09 PHP
php下删除字符串中HTML标签的函数
Aug 27 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
php实现购物车功能(上)
Jul 23 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
php封装的验证码类分享
Feb 26 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
jQuery 表单验证扩展(三)
2010/10/20 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
详解vuex状态管理模式
2018/11/01 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
Python中的元组介绍
2019/01/28 Python
python实现二维数组的对角线遍历
2019/03/02 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
Linux常见面试题
2013/03/18 面试题
机械绘图员岗位职责
2013/11/19 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
校庆标语集锦
2014/06/25 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
2014年检验科工作总结
2014/11/22 职场文书
认真学习保证书
2015/02/26 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
学风建设主题班会
2015/08/17 职场文书