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编程语言开发动态WAP页面
Oct 09 PHP
杏林同学录(九)
Oct 09 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
php获取新浪微博数据API实例
Nov 12 PHP
thinkphp3.0输出重复两次的解决方法
Dec 19 PHP
学习php开源项目的源码指南
Dec 21 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 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面向对象——访问修饰符介绍
2012/11/08 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
Python在线运行代码助手
2016/07/15 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
python tkinter窗口最大化的实现
2019/07/15 Python
高中生校园生活自我评价
2013/09/19 职场文书
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
护理工作感言
2014/01/16 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
高三学习决心书
2014/03/11 职场文书
赡养老人协议书
2014/04/21 职场文书
软件项目实施计划书
2014/05/02 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
会计个人实习计划书
2014/08/15 职场文书
公司演讲稿开场白
2014/08/25 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
监考失职检讨书
2015/01/26 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
MySQL 常见存储引擎的优劣
2021/06/02 MySQL