一、将数据集转换成树

/**
* 将返回的数据集转换成树
* @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();// 创建Tree
if(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) {
}
}
}
}
}

  

php 数据集转换树、递归重组节点信息多维数组(转)的更多相关文章

  1. JavaScript 递归法排列组合二维数组2

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

  2. JavaScript 递归法排列组合二维数组

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

  3. 递归分治算法之二维数组二分查找(Java版本)

    [java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...

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

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

  5. linux设备驱动程序-设备树(3)-设备树多级子节点的转换

    linux设备驱动程序--设备树多级子节点的转换 在上一章:设备树处理之--device_node转换成platform_device中,有提到在设备树的device_node到platform_de ...

  6. Python递归_打印节点信息

    Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ...

  7. PHP 把返回的数据集转换成Tree树

    /** * 把返回的数据集转换成Tree * @access public * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * ...

  8. PHP将数据集转换成树状结构

    /** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * @param string $l ...

  9. 【ACdream 1187】Rational Number Tree(树,递归)

    有理数的树,根节点是1/1,左儿子是1/2,右儿子是2/1....求给定的分数是第几个,或者给定n求第n个分数.递归.给定的分数,每次递归,如果分子比较小,就用分母减去分子,并且这是左儿子.反之是右儿 ...

随机推荐

  1. sql语句将查询的结果拼接成字符串

    表样: sqlserver: --方法1 DECLARE @STR VARCHAR(8000) SELECT @STR=ISNULL(@STR+',','')+userID FROM (SELECT  ...

  2. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  3. 用jQuery实现全选-全不选-反选的功能

    临近过年,刚学IT没多久的小白在这里祝大家在新的一年里:新春快乐,月月赚钱,天天开心,时时快乐,分分精彩,秒秒幸福,事事顺利 古人云:学而时习之,不亦说乎. 学习后经常温习所学的知识,也是件令人愉悦的 ...

  4. 活字格Web应用平台学习笔记4 - 添加记录

    今天继续学习活字格基础教程,目标是创建一个页面,增加记录. 开始之前,系统会自动把上一次的工程文件加载进来. 这是做好后的样子. 我点添加员工的超链接: 先后加了2条员工的信息进来. 不错,设计界面是 ...

  5. WebView动态注入JavaScript脚本

    Demo地址:https://gitee.com/chenyangqi/YouMeDai 背景介绍 在Android与JavaScript交互一文中学习了原生和JS交互,但是如果我们想和别人开发好的w ...

  6. LeetCode题解之Find All Duplicates in an Array

    1.题目描述 2.问题分析 将数组中的元素 A[i] 放到 A[ A[i] - 1] 的位置.然后遍历一边数组,如果不满足 A[i] == i+1,则将A[i]添加到 结果中. 3.代码 vector ...

  7. 用JS实现判断iframe是否加载完成

    本文出至:新太潮流网络博客 var iframe = document.createElement("iframe"); iframe.src = "blog.iinu. ...

  8. Oracle EBS AP 应付核销到确定一行预付款

    -- purpose: 应付标准发票核销预付款发票中的一行 -- 12.2.6 环境 -- author:jenrry create_date: 2017-06-08 declare l_error_ ...

  9. SQL Server 2016 中有外键的表无法被Truncate,只能被Delete

    问: I get the following message even when the table that references it is empty: "Cannot truncat ...

  10. 自己实现more命令

    #include <stdio.h> #include <stdlib.h> #define PAGELEN 24 #define LINELEN 512 int see_mo ...