php 数据集转换树、递归重组节点信息多维数组(转)
一、将数据集转换成树
/*** 将返回的数据集转换成树* @param array $list 数据集* @param string $pk 主键* @param string $pid 父节点名称* @param string $child 子节点名称* @param integer $root 根节点ID* @return array 转换后的树*/ function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root=0) {$tree = array();// 创建Treeif(is_array($list)) {// 创建基于主键的数组引用$refer = array();foreach ($list as $key => $data) {$refer[$data[$pk]] =& $list[$key];}foreach ($list as $key => $data) {// 判断是否存在parent$parentId = $data[$pid];if ($root == $parentId) {$tree[$data[$pk]] =& $list[$key];}else{if (isset($refer[$parentId])) {$parent =& $refer[$parentId];$parent[$child][] =& $list[$key];}}}}return $tree; }
转换前:
转换后:
array(3) {[11] => array(4) {["code"] => int(11)["name"] => string(9) "安徽省"["sup_code"] => string(1) "0"["son"] => array(2) {[0] => array(4) {["code"] => int(114)["name"] => string(9) "蚌埠市"["sup_code"] => string(2) "11"["son"] => array(1) {[0] => array(3) {["code"] => int(1141)["name"] => string(12) "龙子湖区"["sup_code"] => string(3) "114"}}}[1] => array(4) {["code"] => int(115)["name"] => string(9) "芜湖市"["sup_code"] => string(2) "11"["son"] => array(1) {[0] => array(3) {["code"] => int(1151)["name"] => string(9) "弋江区"["sup_code"] => string(3) "115"}}}}}[22] => array(4) {["code"] => int(22)["name"] => string(9) "浙江省"["sup_code"] => string(1) "0"["son"] => array(2) {[0] => array(4) {["code"] => int(221)["name"] => string(9) "杭州市"["sup_code"] => string(2) "22"["son"] => array(5) {[0] => array(3) {["code"] => int(2211)["name"] => string(9) "西湖区"["sup_code"] => string(3) "221"}[1] => array(3) {["code"] => int(2212)["name"] => string(9) "上城区"["sup_code"] => string(3) "221"}[2] => array(3) {["code"] => int(2213)["name"] => string(9) "下城区"["sup_code"] => string(3) "221"}[3] => array(3) {["code"] => int(2215)["name"] => string(9) "拱墅区"["sup_code"] => string(3) "221"}[4] => array(3) {["code"] => int(2216)["name"] => string(9) "萧山区"["sup_code"] => string(3) "221"}}}[1] => array(4) {["code"] => int(222)["name"] => string(9) "嘉兴市"["sup_code"] => string(2) "22"["son"] => array(1) {[0] => array(3) {["code"] => int(2221)["name"] => string(9) "南湖区"["sup_code"] => string(3) "222"}}}}}[33] => array(3) {["code"] => int(33)["name"] => string(9) "山东省"["sup_code"] => string(1) "0"}}
二、递归重组节点信息多维数组字段
方法一
/*** 递归重组节点信息多维数组* @param [array] $node [要处理的节点数组:二维数组]* @param [int] $root [根节点id]* @return [array] [树状结构的节点体系:多维数组]*/
function node_merge($node,$root=0){$arr = array();foreach ($node as $v) {if ($v['pid'] == $root) {$v['child']=node_merge($node,$v['id']);$arr[]=$v;}}return $arr;
}
方法二:
/*** 递归重组节点信息多维数组* @param [array] $node [要处理的节点数组:二维数组]* @param [int] $pid [父级ID]* @param [array] $pidArr [父节点数组]* @return [array] [树状结构的节点体系:多维数组]*/
function node_merge_gai($node,$pid=0,$pidArr){$arr = array();foreach ($node as $v) {if ($v['pid'] == $pid) {if(in_array($v['id'],$pidArr)){$v['child']=node_merge($node,$v['id'],$pidArr);}$arr[]=$v;}}return $arr;
}
调用方法如下图:
此处调用函数array_column是PHP5.5+版本才可支持,此处可以自定义方法,如下
/*** 二维数组转一维数组【实现低版本PHP支持】* @param array $array 多维数组* @param string $column_key 需要返回值的列* @param string $index_key 用作返回数组的索引/键的列* @return array()*/
if (!function_exists("array_column")) {function array_column(array &$rows, $column_key, $index_key = null) {$data = array();if (empty($index_key)) {foreach ($rows as $row) {$data[] = $row[$column_key];}} else {foreach ($rows as $row) {$data[$row[$index_key]] = $row[$column_key];}}return $data;}
}
返回结果如:
array(4) {[0] => array(5) {["id"] => int(1)["name"] => string(5) "Index"["title"] => string(6) "首页"["pid"] => string(1) "0"["child"] => array(2) {[0] => array(5) {["id"] => int(9)["name"] => string(8) "Category"["title"] => string(6) "分类"["pid"] => string(1) "1"["child"] => array(0) {}}[1] => array(5) {["id"] => int(10)["name"] => string(5) "Store"["title"] => string(6) "店铺"["pid"] => string(1) "1"["child"] => array(0) {}}}}[1] => array(5) {["id"] => int(2)["name"] => string(5) "Admin"["title"] => string(6) "后台"["pid"] => string(1) "0"["child"] => array(4) {[0] => array(5) {["id"] => int(5)["name"] => string(5) "Trade"["title"] => string(12) "交易管理"["pid"] => string(1) "2"["child"] => array(0) {}}[1] => array(5) {["id"] => int(6)["name"] => string(6) "Redbag"["title"] => string(12) "红包管理"["pid"] => string(1) "2"["child"] => array(0) {}}[2] => array(5) {["id"] => int(7)["name"] => string(5) "Order"["title"] => string(12) "订单管理"["pid"] => string(1) "2"["child"] => array(0) {}}[3] => array(5) {["id"] => int(8)["name"] => string(7) "Manager"["title"] => string(9) "管理员"["pid"] => string(1) "2"["child"] => array(0) {}}}}[2] => array(5) {["id"] => int(3)["name"] => string(4) "Home"["title"] => string(12) "图片中心"["pid"] => string(1) "0"["child"] => array(0) {}}[3] => array(5) {["id"] => int(4)["name"] => string(6) "Member"["title"] => string(12) "会员中心"["pid"] => string(1) "0"["child"] => array(3) {[0] => array(5) {["id"] => int(11)["name"] => string(4) "Fund"["title"] => string(6) "余额"["pid"] => string(1) "4"["child"] => array(0) {}}[1] => array(5) {["id"] => int(12)["name"] => string(7) "Product"["title"] => string(6) "产品"["pid"] => string(1) "4"["child"] => array(3) {[0] => array(5) {["id"] => int(14)["name"] => string(3) "Out"["title"] => string(9) "卖出的"["pid"] => string(2) "12"["child"] => array(0) {}}[1] => array(5) {["id"] => int(15)["name"] => string(4) "Sale"["title"] => string(9) "在售的"["pid"] => string(2) "12"["child"] => array(0) {}}[2] => array(5) {["id"] => int(16)["name"] => string(2) "In"["title"] => string(9) "仓库的"["pid"] => string(2) "12"["child"] => array(0) {}}}}[2] => array(5) {["id"] => int(13)["name"] => string(5) "Agent"["title"] => string(12) "代理关系"["pid"] => string(1) "4"["child"] => array(0) {}}}}
}
转载于:https://www.cnblogs.com/yszr/p/9405381.html
php 数据集转换树、递归重组节点信息多维数组(转)相关推荐
- js 递归思想 处理后台多维数组的数据 之 完美契合
不多BB! 直接看源码 get(tree = []) { let self = this let arr = []; if (!!tree && tree.length !== 0) ...
- mysql数据表设计 对应成二维数组_结果集数据怎么转换成二维数组
一.用java语言将结果集数据转换成二维数组 主要是用resultset对象的getRow()获得结果集中的行数 getMetaData().getColumnCount() 返回结果集的列数 参考 ...
- XSLT实现XML无极限树(精简版)[二] 解决没有递归出节点属性值总和的问题(JS实现)...
XML数据源文件和第一版的一样! 这个XSLT解决没有递归出节点属性值总和的问题 不过是借助JS实现的 不管怎么样,问题算是解决了! <xsl:stylesheet version=" ...
- js数组对象递归转换树_使用手刹批量转换视频目录树以递归流式传输到Xbox360
js数组对象递归转换树 I've got many many gigs of 640x480 video of the kids and family taken on my Flip Ultra a ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- CrowdHuman密集行人数据集转换代码(可任意选择某些类别的框)
CrowdHuman密集行人数据集转换代码 转换顺序: (odgt--->voc--->coco) 1. odgt--->voc from xml.dom import minido ...
- ROS教程译文1———TF转换树的设置和使用
本文属于ROS翻译文章,来自WIKI: http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF (由于水平有限,翻译错误在所难免,发现错误欢迎评论 ...
- java 获取树的子节点,工作总结---获取树的子节点及树的复制
一:树节点的结构 class KprDimension{ private String id; //树的当前节点id private String name; //树节点名称 private Stri ...
- php树形结构变成线性结构,php把数据集转换成树状结构,无限极分类生成树状 – CSDN博客...
直接上代码,在onethink里面使用的转换树状结构/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid par ...
最新文章
- 【SoftwareTesting】Lab 2
- 图片相似度识别_deepface:人脸识别\特征分析
- 能量分析攻击day02
- SpringMVC——Spring中的DispatcherServlet怎么工作?
- mysql空间释放_linux 空间释放,mysql数据库空间释放
- 蓝桥杯2015决赛-方格填数-枚举 or dfs
- angularjs 利用filter进行表单查询及分页查询
- Storm与Spark区别
- [MySQL]SQL优化工具SQLAdvisor
- linux常见通配符的含义,linux通配符含义
- linux shell有哪些变量,Linux Bash Shell有关变量
- 影创发布首款头手6DoF MR眼镜鸿鹄,搭载高通骁龙XR2平台
- Elesticsearch(es)聚合搜索(入门到精通)3
- 高盛报告:长远看中国网游前景不如门户
- 麻瓜编程python爬虫微专业_网易微专业Python Web开发工程师课程下载
- 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表
- 微信小程序实现九宫格切图,保存功能!
- sklearn之feature_importance_参数的学习
- python学习-Dya13-函数
- 2022年第十四届华中杯数学建模A题解题思路附代码
热门文章
- mysql 的 外连查询
- which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mod
- ros_openvino_toolkit环境搭建纪实
- html5圆圈图标,html5移动端环形图标菜单代码
- Java REST框架一览
- 和我一起学 Selenium WebDriver
- Interfacing to kdb+ from Java
- java-final关键字
- C++-运行时类型信息,异常(day11)
- ashx 绝对路径得到物理路径