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 magic_quotes_gpc的一点认识与分析
Aug 18 PHP
php split汉字
Jun 05 PHP
php date与gmdate的获取日期的区别
Feb 08 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
php 数组随机取值的简单实例
May 23 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
php写入文件不覆盖的实例讲解
Sep 17 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
js根据日期判断星座的示例代码
2014/01/23 Javascript
javascript类型转换示例
2014/04/29 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
javascript常用的设计模式
2017/02/09 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
审计工作个人的自我评价
2013/12/25 职场文书
法学院方阵解说词
2014/01/29 职场文书
运动会稿件200字
2014/02/07 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
房屋产权证明书
2014/10/15 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
给校长的建议书作文300字
2015/09/14 职场文书