一、需要变形的二维数组

 $arr = Array(
Array
(
'material_id' => 1,
'material_name' => '铜板纸',
'parent_id' => 0
),
Array
(
'material_id' => 26,
'material_name' => '哑粉纸',
'parent_id' => 0
),
Array
(
'material_id' => 61,
'material_name' => '胶版',
'parent_id' => 0
),
Array
(
'material_id' => 95,
'material_name' => '高级哑粉',
'parent_id' => 0
),
Array
(
'material_id' => 4,
'material_name' => '250g铜版纸',
'parent_id' => 1
),
Array
(
'material_id' => 5,
'material_name' => '200g铜版纸',
'parent_id' => 1
),
Array
(
'material_id' => 27,
'material_name' => '250g哑粉纸',
'parent_id' => 26
), Array
(
'material_id' => 28,
'material_name' => '200g哑粉纸',
'parent_id' => 26
),
Array
(
'material_id' => 29,
'material_name' => '200g哑粉纸的子项',
'parent_id' => 28
),
Array
(
'material_id' => 30,
'material_name' => '200g哑粉纸的子项的子项',
'parent_id' => 29
)
);

二、变形后的数组形式

 array (
0 =>
array (
'material_id' => 1,
'material_name' => '铜板纸',
'parent_id' => 0,
'children' =>
array (
0 =>
array (
'material_id' => 4,
'material_name' => '250g铜版纸',
'parent_id' => 1,
),
1 =>
array (
'material_id' => 5,
'material_name' => '200g铜版纸',
'parent_id' => 1,
),
),
),
1 =>
array (
'material_id' => 26,
'material_name' => '哑粉纸',
'parent_id' => 0,
'children' =>
array (
0 =>
array (
'material_id' => 27,
'material_name' => '250g哑粉纸',
'parent_id' => 26,
),
1 =>
array (
'material_id' => 28,
'material_name' => '200g哑粉纸',
'parent_id' => 26,
'children' =>
array (
0 =>
array (
'material_id' => 29,
'material_name' => '200g哑粉纸的子项',
'parent_id' => 28,
'children' =>
array (
0 =>
array (
'material_id' => 30,
'material_name' => '200g哑粉纸的子项的子项',
'parent_id' => 29,
),
),
),
),
),
),
),
2 =>
array (
'material_id' => 61,
'material_name' => '胶版',
'parent_id' => 0,
),
3 =>
array (
'material_id' => 95,
'material_name' => '高级哑粉',
'parent_id' => 0,
),
)

 三、实现代码

     public function ceshi($arr, &$arrParent = [])
{
// 首次获取parent_id = 0的相关父级项
foreach ($arr as $key => $val) {
if ($val['parent_id'] == 0) {
$arrParent[] = $val;
unset($arr[$key]);
}
} foreach ($arrParent as $parentKey => $parent) {
foreach ($arr as $key => $val) {
if ($val['parent_id'] == $parent['material_id']) {
$arrParent[$parentKey]['children'][] = $val;
unset($arr[$key]); // 匹配完成则删除
$this->ceshi($arr, $arrParent[$parentKey]['children']);
}
}
} return $arrParent;
}

PHP针对二维数组无限遍历变形研究的更多相关文章

  1. 元素均匀排列自动换行&二维数组前端遍历

    1.元素均匀排列并自动换行 display:flex; flex-wrap:wrap; 2.getFiled();取一行,取多行的话用getFiled(‘id’,true); 3.二维数组前端遍历: ...

  2. C++ 性能小测 1 二维数组的遍历效率

    C++ 性能小测 1 二维数组的遍历效率 遍历二维数组时,常规思路是使用一个嵌套循环.一方面,由于 CPU 使用了分支预测技术,因此通常将循环次数最多循环的放在最内层.另一方面,由于二维数组是按行存储 ...

  3. 二维数组初始化 遍历 动态赋值 内存图 Day08

    package com.sxt.arraytest3; /* * 二维数组 */ public class TestArray { public static void main(String[] a ...

  4. Openjudge-NOI题库-二维数组回形遍历

    题目描述 Description 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组.如图所示:  输入输出格式 Input/ou ...

  5. vector 定义的二维数组的遍历

    之前我们分享了STL的一些容器,再介绍vector中只介绍了二维的vector的定义并没有说二维的vector怎么遍历,那么我们今天就来看下二维的vector怎么遍历 看下面的代码吧. #includ ...

  6. c#中对txt文件的读取与写入,针对二维数组

    class Program { ; ; static string[,] str = new string[ROW, COL]; static void Main(string[] args) { R ...

  7. 二维数组针对某字段排序 - array_multisort()

    /** * 针对二维数组下的某字段排序 * @param array $myarr 被排序数组 * @param string $sort_key 排序根据字段 * @param flag $sort ...

  8. 什么是二维数组?二维遍历?Java二维数组制作图片迷宫 使用如鹏游戏引擎制作窗口界面 附带压缩包下载,解压后双击start.bat启动

    什么是二维数组? 数组当中放的还是数组 int [][] arr=new int[3][2]; 有3个小箱子,每个箱子2个格子. 看结果? int [][] arr=new int[3][2]; Sy ...

  9. 《java入门第一季》二维数组三个案例详解

    案例一:遍历二维数组 /* 需求:二维数组遍历 外循环控制的是二维数组的长度,其实就是一维数组的个数行数. 内循环控制的是一维数组的长度,每一行,一维数组元素分别的个数. */ class Array ...

随机推荐

  1. 反射-Class

    package classes; public class ClassDemo1 { public static void main(String[] args){ Foo foo1 = new Fo ...

  2. React-Redux之API

    connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options]) 连接 React 组件与 Redux store. 连 ...

  3. nginx中有关命令和日志切割,配置文件加载的详细阐述

    一.Nginx简介 Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器.Nginx 已经在俄罗斯最大的门户网站── Ram ...

  4. mvvm 模板中事件没有执行的解决方案

    今天在wpf设计的过程中,用到了listview,数据绑定在模板中进行,其中有个按钮的click事件,一直不执行,很奇怪,找了很久才找到解决办法,原因还是暂时不清除: <ListView x:N ...

  5. JSP+JavaBean+Servlet工作原理实例…

    JSP+JavaBean+Servlet工作原理实例讲解 首先,JavaBean和Servlet虽都是Java程序,但是是完全不同的两个概念.引用mz3226960提出的MVC的概念,即M-model ...

  6. jQuery命名空间和自定义插件的的多种方法

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jquery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  7. LeetCode: 598 Range Addition II(easy)

    题目: Given an m * n matrix M initialized with all 0's and several update operations. Operations are r ...

  8. ABP 软删除ISoftDelete

    一.简介 ABP 的软删除是为了,在删除的时候,不是真正的删除数据,是为了保护数据. 二.具体实现 在 Core  层,我们需要这个实体去实现这个 ISoftDelete 接口.实现它的 public ...

  9. 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)

    传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...

  10. vue -- key的特殊作用

    v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg ...