PHP数组合并

PHP数组合并很多时候我们要把多个数组进行合并,在php函数库中合并函数有:直接合并:array_merge,array_merge_recursive;间接合并:array_map,array_filter等可以使用匿名函数的方法还有一种合并方式,那就是+这个实际就是一种运算,但在很多时候它能完成直接合并不能完成的数组合并。在这里不对间接合并作说明,因为…

大家好,又见面了,我是你们的朋友全栈君。

很多时候我们要把多个数组进行合并,在php函数库中合并函数有:

直接合并:array_merge,array_merge_recursive;

间接合并:array_map,array_filter等可以使用匿名函数的方法

还有一种合并方式,那就是 + 这个实际就是一种运算,但在很多时候它能完成直接合并不能完成的数组合并。

在这里不对间接合并作说明,因为间接数据已经类似foreach循环处理。

wKiom1SSZ7Ow4sV-AAJdJwbCYeg922.jpg

array_merge_recursive 函数是针对多个数组合并但不能丢失每一个元素

wKiom1SSZ7Oj3NCYAAIUeaqurfw488.jpg

array_merge 函数是针对多个数组合并只要后面有重复的就覆盖前面的。


array_merge_recursive,array_merge这两个函数在合并数字下标或索引下标时是不会覆盖,而是重写原标下为默认索引下标按每个数组元素先后顺序追加到合并新数组中去,所以当待合并数组中需要覆盖数字下标的元素时这两个函数就不能直接合并了,要么给把下标修改成不纯数字,要么使用循环语句,或者使用 +

+ 运算在处理数组时,必须保证两边的运算值都是数组,注意:+前面的数组会覆盖后面数组相同键名的值,这个与函数调用正好相反

例如:

wKiom1ST6JWwnfyzAAGU3xw4nYQ281.jpg

$arr与$arr1是两个混合数组,结构相同,只是数据有些差别,通过上面不同方式合并结果完全不相同,合并后主要看点是数组中下标为test2与123的合并结果变化。


函数 array_merge 合并存在覆盖元素,但对于索引元素只会累加而不是覆盖,那它合并后的结果是:

wKioL1ST6WijMsEaAAFPATZPA9c497.jpg


结论:使用array_merge函数对数组进行合并,系统只会对数组的第一层下标进行判断,数字下标的元素会全部保留,并且在不影响元素索引位置重置下标,标下的顺序是从第一个数组开始然后累加后面的数组,字符串类下标系统只保留最后出现下标与元素,不会递归到元素的内层数组中,直接覆盖前面的元素。

函数 array_merge_recursive 合并存在覆盖元素,但对于索引元素只会累加而不是覆盖,那它合并后的结果是:

wKioL1ST6Y_hdLusAAGjnpZfLGg416.jpg

结论:使用array_merge_recursive对数组进行合并,系统只对第一层数字下标的元素进行重置为索引下标并保留原来的位置,字符串类下标元素是不会覆盖,而是递归到内层,递归中有数字下标的停止当前元素递归并重置下标,下标是以当前递归层内第一个数字下标为起点值进行累加,并不全从0开始累加,递归层内最内层的字符串下标出现相同时,会在最小层内创建一个数组并按重复的先后顺序添加到这个数组中去,数组以默认索引下标进行添加

使用$arr + $arr1 运算方式是不会重置下标,所以相同下标的元素都会以+左边的数组为主去覆盖+右边的元素,那运算后的结果是:

wKiom1ST6RegyqE7AAEBqChG0DQ558.jpg

结论:使用+运算合并数组,系统只对运算数组的第一层元素进行严格的下标合并覆盖,运算前面的数组会覆盖后面所有相同下标的元素,并且不会递归到内层,所有数字下标与字符串下标都将进行覆盖操作,并且不会修改下标。


大部分开发中都会使用函数或循环合并数组,其它很多时候使用+会更方便,总结下这三种方式的合并场景:


array_merge :应用在只对字符串下标覆盖(后面出现的覆盖前面出现的元素),数字下标的全部累加且不关注下标是否修改或要求重置默认数字下标,所有的合并只在第一层元素与对应的下标下完成,并不递归到内层元素。


array_merge_recursive :应用在不覆盖任何元素,相同字符串下标的元素会递归到内层并在最小合并层时创建一个数组将重复的元素追加到这个数组中,数字下标的停止当前元素递归合并全部累加到当前层(如果是第一层会重置数字下标为默认索引下标,第二层及更深层不会修改第一个元素的下标值,只会重置第二个及以后的所有当层数字下标以第一个下标为起始下标值累加)且不关注下标是否修改或要求重置默认数字下标。


应用在严格按下标(不区分下标是否与数字或字符串)覆盖,或者下标不相同时累加且不重置下标。

本文转自  ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/1591933


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151245.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Java开发的testNG接口自动化测试

    基于Java开发的testNG接口自动化测试1.TestNG简介TestNG是一个开源的测试框架与Junit的发行顺序:Junit3->TestNG->Junit4,TestNG的灵感来自于Junit3,在TestNG推出不久后,Junit借鉴了其中很多概念,也推出了差不多四年以来首个发行版本Junit4。所以,TestNG跟JUnit4很像,但它并不是JUnit的扩展,它的创建目的是超越Junit。TestNG具有更强…

    2025年8月13日
    2
  • Alex 的 Hadoop 菜鸟教程: 第9课 zookeeper 介绍和使用

    Alex 的 Hadoop 菜鸟教程: 第9课 zookeeper 介绍和使用看了之前的教程,会发现多处出现zookeeper,比如hadoop的autofailover得用zookeeper,Hbase的RegionServer也得用zookeeper。其实不止hadoop,包括现在小有名气的Storm用的也是zookeeper。那么zookeeper究竟是做什么用的?

    2022年5月31日
    37
  • 双系统轻松卸载Vista系统攻略

    双系统轻松卸载Vista系统攻略☆使用DaemonTools加载Vista光盘映像(或者放入Vista光盘)  ☆打开“运行”(开始〉运行),输入cmd  ☆输入X:(X代表你的虚拟光驱盘符)  ☆输入cdboot  ☆输入bootsect/nt52SYS(使用启动修复程序改变系统盘启动管理器)  ☆重新启动,Vista的启动管理器已经消失了  ☆删除在启动盘中的:

    2022年10月12日
    4
  • 检测计算机命令,磁盘检测命令chkdsk的使用方法

    检测计算机命令,磁盘检测命令chkdsk的使用方法经常看到有很多朋友在系统开机的时候因系统自检程序时间过长而往往直接跳过磁盘检测 而直接跳过这种心急的想法有时候会引来大祸患 今天我们介绍的 chkdsk 命令是系统自带的系统修复命令 可以帮助我们解决很多常见问题 它可以帮助恢复系统文件 有时可以延缓硬盘的寿命 对此想要有了解的朋友跟随小编一起来看看吧 磁盘检测的原因多是由于系统检测到磁盘数据调用错误或者数据文件丢失而自发引起的一种自我保护措施 使用磁

    2025年6月19日
    3
  • vmware 15.5.7 激活码【中文破解版】

    (vmware 15.5.7 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年4月1日
    169
  • 400报错有关[通俗易懂]

    400报错有关[通俗易懂]400报错是数据类型对不上,畸形,以下是经常报400的地方1.时间封装类中没有加时间注解或者使用时分秒是在新增页面使用f标签去吊.0使用<f:>2.外键name值中只加属性没加属性的属性id(注:这个是属性是外键所以需要对象.对象id)3.封装类Date包导成sql了…

    2022年5月20日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号