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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BigDecimal的除法

    BigDecimal的除法BigDecimaldivideBigDecimal=subBigDecimal.divide(newBigDecimal(13),0,BigDecimal.ROUND_HALF_UP);第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种ROUND_CEILING//向正无穷方向…

    2022年6月15日
    45
  • 汇编指令和机器码的对应表_汇编和机器码对照表

    汇编指令和机器码的对应表_汇编和机器码对照表指令集依照机器操作码、汇编助记符和汇编操作数来描述指令,遵循下列约定:lreg8:8位寄存器。lreg16:16位寄存器。lmem8:8位内存数值。lmem16:16位内存数值。limmed8:8位立即数值。limmed16:16位立即数值。limmed32:32位立即数值。lsegReg:16位段寄存器。机器操作码汇编助记符和操作数00ADDreg8/mem8,reg801ADD

    2022年9月25日
    0
  • Linux重启网卡失败_debian重启网卡命令

    Linux重启网卡失败_debian重启网卡命令Linux下解决网卡重启失败:Jobfornetwork.servicefailedbecausethecontrolprocessexitedwitherrorcode

    2022年9月2日
    2
  • oracle date_trunc_oracle中truncate用法

    oracle date_trunc_oracle中truncate用法PostgreSQL与Oracle对应的函数一、对应的函数1.sysdateoraclepgsqlsysdatecurrent_date、current_timestampnvlcoalescetruncdate_trunc(text,timestamp)…文章rayner2018-01-05842浏览量Oracle日期显示问题以及trunc方法的使用我们先来假设这么一个场景,只要输入一个…

    2022年10月25日
    0
  • 小程序onLaunch事件的坑「建议收藏」

      记一个小程序踩过的坑小程序项目中app.js里面定义了globalData,即全局变量,里面定义了一个token字段需求是这样的,每次进入小程序的时候需要检验该token有没有,没有就请求后台获取token,由于我一开始将该检验函数A放在onLaunch事件里面,但是这个函数A是引入的其他js文件里面的,这时候我在这个js文件里面使用constapp=getApp()的时候发现获…

    2022年4月14日
    48
  • Linux 内核定时器实验

    Linux 内核定时器实验Linux时间管理和内核定时器简介50.1.1内核时间管理简介学习过UCOS或FreeRTOS的同学应该知道,UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟源。同理,Linux要运行,也是需要一个系统时钟的,至于这个系统时钟是由哪个定时器提供的,笔者没有去研究过Linux内核。Linux内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提

    2022年7月26日
    9

发表回复

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

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