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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 PHP
PHP中Date获取时间不正确怎么办
Jun 05 PHP
php win下Socket方式发邮件类
Aug 21 PHP
php使用json_encode对变量json编码
Apr 07 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
列表内容的选择
2006/06/30 Javascript
用 JavaScript 迁移目录
2006/12/18 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
浅析JavaScript动画
2015/06/10 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
什么是python的列表推导式
2020/05/26 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
社区先进事迹材料
2014/05/19 职场文书
咖啡店创业计划书
2014/08/15 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
MySQL 逻辑备份 into outfile
2022/05/15 MySQL