一、将数据集转换成树

/*** 将返回的数据集转换成树* @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 数据集转换树、递归重组节点信息多维数组(转)相关推荐

  1. js 递归思想 处理后台多维数组的数据 之 完美契合

    不多BB! 直接看源码 get(tree = []) { let self = this let arr = []; if (!!tree && tree.length !== 0) ...

  2. mysql数据表设计 对应成二维数组_结果集数据怎么转换成二维数组

    一.用java语言将结果集数据转换成二维数组 主要是用resultset对象的getRow()获得结果集中的行数 getMetaData().getColumnCount()  返回结果集的列数 参考 ...

  3. XSLT实现XML无极限树(精简版)[二] 解决没有递归出节点属性值总和的问题(JS实现)...

    XML数据源文件和第一版的一样! 这个XSLT解决没有递归出节点属性值总和的问题 不过是借助JS实现的 不管怎么样,问题算是解决了! <xsl:stylesheet version=" ...

  4. js数组对象递归转换树_使用手刹批量转换视频目录树以递归流式传输到Xbox360

    js数组对象递归转换树 I've got many many gigs of 640x480 video of the kids and family taken on my Flip Ultra a ...

  5. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  6. CrowdHuman密集行人数据集转换代码(可任意选择某些类别的框)

    CrowdHuman密集行人数据集转换代码 转换顺序: (odgt--->voc--->coco) 1. odgt--->voc from xml.dom import minido ...

  7. ROS教程译文1———TF转换树的设置和使用

    本文属于ROS翻译文章,来自WIKI: http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF (由于水平有限,翻译错误在所难免,发现错误欢迎评论 ...

  8. java 获取树的子节点,工作总结---获取树的子节点及树的复制

    一:树节点的结构 class KprDimension{ private String id; //树的当前节点id private String name; //树节点名称 private Stri ...

  9. php树形结构变成线性结构,php把数据集转换成树状结构,无限极分类生成树状 – CSDN博客...

    直接上代码,在onethink里面使用的转换树状结构/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid par ...

最新文章

  1. 【SoftwareTesting】Lab 2
  2. 图片相似度识别_deepface:人脸识别\特征分析
  3. 能量分析攻击day02
  4. SpringMVC——Spring中的DispatcherServlet怎么工作?
  5. mysql空间释放_linux 空间释放,mysql数据库空间释放
  6. 蓝桥杯2015决赛-方格填数-枚举 or dfs
  7. angularjs 利用filter进行表单查询及分页查询
  8. Storm与Spark区别
  9. [MySQL]SQL优化工具SQLAdvisor
  10. linux常见通配符的含义,linux通配符含义
  11. linux shell有哪些变量,Linux Bash Shell有关变量
  12. 影创发布首款头手6DoF MR眼镜鸿鹄,搭载高通骁龙XR2平台
  13. Elesticsearch(es)聚合搜索(入门到精通)3
  14. 高盛报告:长远看中国网游前景不如门户
  15. 麻瓜编程python爬虫微专业_网易微专业Python Web开发工程师课程下载
  16. 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表
  17. 微信小程序实现九宫格切图,保存功能!
  18. sklearn之feature_importance_参数的学习
  19. python学习-Dya13-函数
  20. 2022年第十四届华中杯数学建模A题解题思路附代码

热门文章

  1. mysql 的 外连查询
  2. which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mod
  3. ros_openvino_toolkit环境搭建纪实
  4. html5圆圈图标,html5移动端环形图标菜单代码
  5. Java REST框架一览
  6. 和我一起学 Selenium WebDriver
  7. Interfacing to kdb+ from Java
  8. java-final关键字
  9. C++-运行时类型信息,异常(day11)
  10. ashx 绝对路径得到物理路径