PHP两个二维数组数据处理:字段值相等,则赋值给另一个数组
- 零、写在前面
- 一、分析
- 二、代码
- 三、打印
零、写在前面
- 最近都不知道写什么了,这里要感谢我的挚友
小王
给了我写文章的素材。
一、分析
- 我们可以看到,最终改变的是
$parent 数组
的值,所以我们需要先处理$child 数组
,然后循环$parent 数组
,把满足条件的$child 数组
的值赋值给$parent 数组
。 - 从
test1()
中可以得知,我们需要使用到$child 数组
中的name
和s
字段,然后根据s
把calc
赋值给$parent 数组
的calc_a
,calc_b
,calc_c
,calc_sum
。 test2()
中,先循环$child
,把$child
中的name
,s
作为键赋值给$pinCombine
;再循环$parent
,判断$pinCombine
的键name
是否存在,再把键1
,2
,3
里的calc
赋值给$parent
的calc_a
,calc_b
,calc_c
,最后再把这3个求和设置为$parent
的calc_sum
。- 优化后循环的的次数 就从之前的:
count($parent) * count($child)
,变成了count($parent) + count($child)
,效率随着数据量增大越明显。
二、代码
- 入口方法:
test()
public function test() {$test1 = $this->test1();$test2 = $this->test2();echo '<pre>';echo '优化前数据:<br/>';var_export($test1);echo '<br/>优化后数据:<br/>';var_export($test2);
}//生成数据
public function getData() {$parent = [['name' => 'name0', 'calc_sum' => 0, 'calc_a' => 0, 'calc_b' => 0, 'calc_c' => 0],['name' => 'name1', 'calc_sum' => 0, 'calc_a' => 0, 'calc_b' => 0, 'calc_c' => 0],['name' => 'name2', 'calc_sum' => 0, 'calc_a' => 0, 'calc_b' => 0, 'calc_c' => 0]];$child = [['name' => 'name1', 'calc' => 3, 's' => 1],['name' => 'name1', 'calc' => 4, 's' => 2],['name' => 'name1', 'calc' => 11, 's' => 3],['name' => 'name2', 'calc' => 10, 's' => 1],['name' => 'name2', 'calc' => 6, 's' => 2],['name' => 'name2', 'calc' => 1, 's' => 3]];return [$parent, $child];
}//优化前版本:双层循环,次数呈指数增长,循环: count($parent) * count($child) 次
public function test1() {list($parent, $child) = self::getData();foreach ($parent as &$v) {foreach ($child as $val) {if ($v['name'] == $val['name']) {switch ($val['s']) {case 1:$v['calc_a'] = $val['calc'];break;case 2:$v['calc_b'] = $val['calc'];break;case 3:$v['calc_c'] = $val['calc'];break;}}}$v['calc_sum'] = $v['calc_a'] + $v['calc_b'] + $v['calc_c']; //求和}return $parent;
}//优化后版本:数组分开循环,循环: count($parent) + count($child) 次
public function test2() {list($parent, $child) = self::getData();//数据处理$pinCombine = [];foreach ($child as $value) {$pinCombine[$value['name']][$value['s']] = $value; //唯一的}foreach ($parent as &$item) {$pinInfo = isset($pinCombine[$item['name']]) ? $pinCombine[$item['name']] : [];if ($pinInfo) {if (isset($pinInfo[1])) {$item['calc_a'] = $pinInfo[1]['calc'];}if (isset($pinInfo[2])) {$item['calc_b'] = $pinInfo[2]['calc'];}if (isset($pinInfo[3])) {$item['calc_c'] = $pinInfo[3]['calc'];}}$item['calc_sum'] = $item['calc_a'] + $item['calc_b'] + $item['calc_c']; //求和}return $parent;
}
三、打印
优化前数据:
array (0 => array ('name' => 'name0','calc_sum' => 0,'calc_a' => 0,'calc_b' => 0,'calc_c' => 0,),1 => array ('name' => 'name1','calc_sum' => 18,'calc_a' => 3,'calc_b' => 4,'calc_c' => 11,),2 => array ('name' => 'name2','calc_sum' => 17,'calc_a' => 10,'calc_b' => 6,'calc_c' => 1,),
)
优化后数据:
array (0 => array ('name' => 'name0','calc_sum' => 0,'calc_a' => 0,'calc_b' => 0,'calc_c' => 0,),1 => array ('name' => 'name1','calc_sum' => 18,'calc_a' => 3,'calc_b' => 4,'calc_c' => 11,),2 => array ('name' => 'name2','calc_sum' => 17,'calc_a' => 10,'calc_b' => 6,'calc_c' => 1,),
)
PHP两个二维数组数据处理:字段值相等,则赋值给另一个数组相关推荐
- php 两个二维数组怎么去重,php 二维数组怎么不去重合并
php二维数组不去重合并的方法:首先创建一个PHP示例文件:然后创建两个二维数组:最后通过"array_merge_recursive"函数合并数组即可. 本文操作环境:Windo ...
- Java黑皮书课后题第8章:8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的。编写一个方法,如果m1和m2相同的话,返回true
8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的.编写一个方法,如果m1和m2相同的话,返回true 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 8. ...
- Java黑皮书课后题第8章:8.28(严格相同的数组)如果两个二维数组m1和m2相应的元素相等的话,则认为它们是严格地相同的。编写一个方法,如果m1和m2是严格相同的话,返回true
8.28(严格相同的数组)如果两个二维数组m1和m2相应的元素相等的话,则认为它们是严格地相同的.编写一个方法,如果m1和m2是严格相同的话,返回true 题目 题目描述与运行示例 破题 代码 题目 ...
- R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来、Overlay two ggplot2 stat_density2d plots
R语言ggplot2可视化2D密度图:可视化二维密度图并将两个二维密度图重叠起来.Overlay two ggplot2 stat_density2d plots 目录
- 两张二维人物图像互相换脸代码
之前看了一篇介绍两张二维人物图像互相换脸代码:http://www.cnblogs.com/wm123/p/5370064.html,但是配置环境挺麻烦文章没讲清楚,而且代码有问题,特此重新写个清楚的 ...
- 微信两个二维码无法在同一视窗中扫描——每周汇总(第二期)
接到一个运营页的需求,一开始设计的是两个二维码横着排列在页面上,切完图后发现在手机上点击图片扫一扫只能扫其中的一个,一开始以为是图片的问题,后来尝试换成上下排列还是不行,查阅网上资料后才发现这是微信导 ...
- java生成两种二维码
引言 在这篇博客中关于二维码的基本原理先不做介绍,先介绍我们怎样利用java语言实现二维码的生成,现在二维 码在我们生活中已经非常常见了,一言不合就扫码!所以对于我们这帮程序猿来说,需要研究一把这个东 ...
- Python——两类二维数据线性判别fisher
题目: 说明:下述问题在 Python 中编程求解. 1.已知两类二维数据, (1)第一类共 4 个样本:[6,6],[4,5],[5,5],[5,4],第二类共 4 个样本: [0,1],[1,2] ...
- 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 灰度图像的二维傅里叶变换(cv_gray_fft ...
- opencv 计算二维矢量的幅值—magnitude()函数
计算二维矢量的幅值:magnitude()函数 该函数用来计算二维矢量的幅值 void magnitude(InputArray x,InputArray y,OutputArray magnitud ...
最新文章
- 花了两天,终于把 Python 的 setup.py 给整明白了
- 基2频率抽取实现FFT的Verilog程序
- 如何保留5个有效数字输出c不4舍5入_10 个C语言课设小项目拿走不谢~
- linux i2c ioctl错误,关于读写I2C总线的时候出错的有关问题
- 请问生产成本收集器与标准成本评估有什么关联?
- 使用fastcoll进行md5碰撞,两个不同的文件md5值一样。
- flink on yarn shell的session cluster模式实验记录
- 【人生杂谈】宇宙/暗物质/擎天柱
- oracle 添加默认值列,Oracle 11g增加列,并带默认值的新特性
- 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
- logistics 与最大熵模型原理及python代码实现
- HTML led字体包
- matlab rms数据滤波,与RMS相关的5个信息,如何通过RMS结果滤波来提高精度
- 递归与自我指涉标识牌Top 5
- 在线免费caj转Word,不用安装软件
- Windows7安装无法识别硬盘分区
- 幻灯片制作 新手制作幻灯片-来自于三人行慕课
- Ubuntu20.04 向日葵无法被远控的解决办法
- 最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY。
- 微型计算机celeron是,谁是赛扬D最佳搭档?微型计算机告诉你
热门文章
- map的基本操作总结C++
- PAT排名汇总(排序)
- 深度学习优化算法大全系列6:Adam
- 递推算法之平面分割问题总结
- linux列出当前目录及父目录,linux – 仅列出文件的公共父目录
- workman php教程_Workerman
- oracle optimizer_index_cost_adj,OPTIMIZER_INDEX_COST_ADJ与成本计算
- android dns 测试工具,DNS Test测速工具
- python实现带头结点的单链表的就地逆置_带头结点的单链表就地逆置 (10 分)...
- 火狐html5播放器,可能用户已经发现你在火狐内建HTML5音视频播放器