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代码飞起来的40条小技巧(提升php效率)
Apr 12 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 PHP
PHP安全配置详细说明
Sep 26 PHP
优化PHP程序的方法小结
Feb 23 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
php的sso单点登录实现方法
Jan 08 PHP
PHP中$_SERVER使用说明
Jul 05 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
Yii2实现中国省市区三级联动实例
Feb 08 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
PHP单例模式简单用法示例
Jun 23 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
js实现抽奖功能
2020/11/24 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现保证只能运行一个脚本实例
2015/06/24 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python返回数组的索引实例
2019/11/28 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
英国最大的百货公司:Harrods
2016/08/18 全球购物
护理学毕业生求职信
2013/11/14 职场文书
酒吧创业计划书
2014/01/18 职场文书
班主任工作经验材料
2014/02/02 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
六年级情感作文之500字
2019/10/23 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书