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


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 电路交换和分组交换的异同_电路交换的三个过程

    电路交换和分组交换的异同_电路交换的三个过程从交换技术的发展历史看,数据交换经历了电路交换、报文交换、分组交换和综合业务数字交换的发展过程。  电路交换  电路交换就是计算机终端之间通信时,一方发起呼叫,独占一条物理线路。当交换机完成接续,对方收到发起端的信号,双方即可进行通信。在整个通信过程中双

  • STM32的NVIC和中断的总结「建议收藏」

    STM32的NVIC和中断的总结「建议收藏」前言:1.要想学习STM32中断,要先掌握STM32对优先级的定义;2.有51单片机开发经验会比较容易理解中断优先级;3.本篇博文基于STM32F103ZET6芯片和3.5.0标准库编写;4.本篇博文从寄存器入手,最终实现编程的步骤;如有不足之处,还请前辈多多指教;一基础知识1.cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍

  • JSON C# Class Generator —由json字符串生成C#实体类的工具

    JSON C# Class Generator —由json字符串生成C#实体类的工具

  • 【Redis】五种数据类型及其使用场景

    Redis数据类型五种类型与类比java的模型string–>Stringhash–>Hashmaplist–>LinkListset–>HashSetsorted_set–>TreeSetString类型redis数据存储格式redis自身是一个Map类型的存储方式,其中所有的数据都是采用key:value的形式存储我们讨论的数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串St

  • JVM调优工具

    JVM调优工具JVM调优工具Jconsole:jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。JProfiler:商业软件,需要付费。功能强大。VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。如何调优观察内存释放情况、集合类检查、对象树上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能堆信息查…

  • Spring AOP四种实现方式Demo详解与相关知识探究[通俗易懂]

    Spring AOP四种实现方式Demo详解与相关知识探究[通俗易懂]一、前言在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版、代码格式有强迫症的人来说,实在是不能忍受~~~~(>_我亲手实现了一遍,重新整理,加上了一些不易关注到的细节、漏掉的知识,以及自己对AOP的一些理解,写成这篇博客。二、AOP相关概念(1)AOP是什么?AOP与拦截器的区别?太抽象的不说,如果你知道St

发表回复

您的电子邮箱地址不会被公开。

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