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 相关文章推荐
从C/C++迁移到PHP——判断字符类型的函数
Oct 09 PHP
PHP form 表单传参明细研究
Jul 17 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
php UBB 解析实现代码
Nov 27 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
mac下安装nginx和php
Nov 04 PHP
PHP检测用户语言的方法
Jun 15 PHP
PHP实现递归目录的5种方法
Oct 27 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 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制作静态网站的模板框架(一)
2006/10/09 PHP
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
php $_SERVER当前完整url的写法
2009/11/12 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP 断点续传实例详解
2017/11/11 PHP
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
Python随机生成带特殊字符的密码
2016/03/02 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
盛大二次面试题
2016/11/18 面试题
中学生旷课检讨书模板
2014/10/08 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书