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加速的eAccelerator dll支持文件打包下载
Sep 30 PHP
php adodb介绍
Mar 19 PHP
PHPMailer 中文使用说明小结
Jan 22 PHP
PHP学习笔记之二 php入门知识
Jan 12 PHP
php一个找二层目录的小东东
Aug 02 PHP
PHP-redis中文文档介绍
Feb 07 PHP
php中hashtable实现示例分享
Feb 13 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 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获取地址栏信息的代码
2008/10/08 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
sublime text 3配置使用python操作方法
2017/06/11 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
NFL官方在线商店:NFLShop
2020/07/29 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
入团者的自我评价分享
2013/12/02 职场文书
质检部职责
2013/12/28 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
补充协议书范本
2014/04/23 职场文书
供用电专业求职信
2014/07/07 职场文书
公司委托书格式范本
2014/09/16 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
文明旅游倡议书
2015/04/28 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
Nginx反向代理学习实例教程
2021/10/24 Servers
Vue2.0搭建脚手架
2022/03/13 Vue.js