• 零、写在前面
  • 一、分析
  • 二、代码
  • 三、打印

零、写在前面

  • 最近都不知道写什么了,这里要感谢我的挚友小王给了我写文章的素材。

一、分析

  • 我们可以看到,最终改变的是 $parent 数组的值,所以我们需要先处理 $child 数组,然后循环$parent 数组,把满足条件的$child 数组的值赋值给$parent 数组
  • test1()中可以得知,我们需要使用到 $child 数组中的names字段,然后根据scalc赋值给$parent 数组calc_acalc_bcalc_ccalc_sum
  • test2()中,先循环$child,把$child中的names作为键赋值给$pinCombine;再循环$parent,判断$pinCombine的键name是否存在,再把键123里的calc赋值给$parentcalc_acalc_bcalc_c,最后再把这3个求和设置为$parentcalc_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两个二维数组数据处理:字段值相等,则赋值给另一个数组相关推荐

  1. php 两个二维数组怎么去重,php 二维数组怎么不去重合并

    php二维数组不去重合并的方法:首先创建一个PHP示例文件:然后创建两个二维数组:最后通过"array_merge_recursive"函数合并数组即可. 本文操作环境:Windo ...

  2. Java黑皮书课后题第8章:8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的。编写一个方法,如果m1和m2相同的话,返回true

    8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的.编写一个方法,如果m1和m2相同的话,返回true 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 8. ...

  3. Java黑皮书课后题第8章:8.28(严格相同的数组)如果两个二维数组m1和m2相应的元素相等的话,则认为它们是严格地相同的。编写一个方法,如果m1和m2是严格相同的话,返回true

    8.28(严格相同的数组)如果两个二维数组m1和m2相应的元素相等的话,则认为它们是严格地相同的.编写一个方法,如果m1和m2是严格相同的话,返回true 题目 题目描述与运行示例 破题 代码 题目 ...

  4. R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来、Overlay two ggplot2 stat_density2d plots

    R语言ggplot2可视化2D密度图:可视化二维密度图并将两个二维密度图重叠起来.Overlay two ggplot2 stat_density2d plots 目录

  5. 两张二维人物图像互相换脸代码

    之前看了一篇介绍两张二维人物图像互相换脸代码:http://www.cnblogs.com/wm123/p/5370064.html,但是配置环境挺麻烦文章没讲清楚,而且代码有问题,特此重新写个清楚的 ...

  6. 微信两个二维码无法在同一视窗中扫描——每周汇总(第二期)

    接到一个运营页的需求,一开始设计的是两个二维码横着排列在页面上,切完图后发现在手机上点击图片扫一扫只能扫其中的一个,一开始以为是图片的问题,后来尝试换成上下排列还是不行,查阅网上资料后才发现这是微信导 ...

  7. java生成两种二维码

    引言 在这篇博客中关于二维码的基本原理先不做介绍,先介绍我们怎样利用java语言实现二维码的生成,现在二维 码在我们生活中已经非常常见了,一言不合就扫码!所以对于我们这帮程序猿来说,需要研究一把这个东 ...

  8. Python——两类二维数据线性判别fisher

    题目: 说明:下述问题在 Python 中编程求解. 1.已知两类二维数据, (1)第一类共 4 个样本:[6,6],[4,5],[5,5],[5,4],第二类共 4 个样本: [0,1],[1,2] ...

  9. 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 灰度图像的二维傅里叶变换(cv_gray_fft ...

  10. opencv 计算二维矢量的幅值—magnitude()函数

    计算二维矢量的幅值:magnitude()函数 该函数用来计算二维矢量的幅值 void magnitude(InputArray x,InputArray y,OutputArray magnitud ...

最新文章

  1. 花了两天,终于把 Python 的 setup.py 给整明白了
  2. 基2频率抽取实现FFT的Verilog程序
  3. 如何保留5个有效数字输出c不4舍5入_10 个C语言课设小项目拿走不谢~
  4. linux i2c ioctl错误,关于读写I2C总线的时候出错的有关问题
  5. 请问生产成本收集器与标准成本评估有什么关联?
  6. 使用fastcoll进行md5碰撞,两个不同的文件md5值一样。
  7. flink on yarn shell的session cluster模式实验记录
  8. 【人生杂谈】宇宙/暗物质/擎天柱
  9. oracle 添加默认值列,Oracle 11g增加列,并带默认值的新特性
  10. 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
  11. logistics 与最大熵模型原理及python代码实现
  12. HTML led字体包
  13. matlab rms数据滤波,与RMS相关的5个信息,如何通过RMS结果滤波来提高精度
  14. 递归与自我指涉标识牌Top 5
  15. 在线免费caj转Word,不用安装软件
  16. Windows7安装无法识别硬盘分区
  17. 幻灯片制作 新手制作幻灯片-来自于三人行慕课
  18. Ubuntu20.04 向日葵无法被远控的解决办法
  19. 最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY。
  20. 微型计算机celeron是,谁是赛扬D最佳搭档?微型计算机告诉你

热门文章

  1. map的基本操作总结C++
  2. PAT排名汇总(排序)
  3. 深度学习优化算法大全系列6:Adam
  4. 递推算法之平面分割问题总结
  5. linux列出当前目录及父目录,linux – 仅列出文件的公共父目录
  6. workman php教程_Workerman
  7. oracle optimizer_index_cost_adj,OPTIMIZER_INDEX_COST_ADJ与成本计算
  8. android dns 测试工具,DNS Test测速工具
  9. python实现带头结点的单链表的就地逆置_带头结点的单链表就地逆置 (10 分)...
  10. 火狐html5播放器,可能用户已经发现你在火狐内建HTML5音视频播放器