PHP 数组怎么合并
早上整理购物清单时,你是不是会把昨天想买的牛奶、面包,和今天看到的鸡蛋、苹果,一股脑记在同一张便签上?其实这和PHP里的数组合并是一回事——把两个或多个零散的“数据小堆”,整合成一个完整的“大清单”。很多刚接触PHP的新手,常会在合并数组时踩坑,今天就用生活化的例子,把这个知识点说透。
先搞懂:PHP的数组是什么?
不用想复杂的专业定义,你可以把PHP数组理解成一个“带编号的收纳盒”,每个格子里放一样东西,编号就是你取东西的“钥匙”。比如你把“苹果”放编号0的格子,“香蕉”放编号1的格子,这个数组就可以写成$fruit = ["苹果", "香蕉"]。

如果另一个收纳盒里装着“牛奶”“面包”,编号是0和1,这两个收纳盒就是两个数组。合并数组,就是把这两个盒子里的东西,放进同一个新盒子里。但这里要注意,PHP数组的编号(专业叫“键名”)如果重复,处理方式会不一样,这也是新手最容易错的地方。
最常用的合并函数:array_merge()
这是PHP官方推荐的“万能合并工具”,适合大多数普通场景。举个例子:
你做了两个数组,一个是你家本周要采购的$this_week = ["鸡蛋", "大米"],另一个是下周计划的$next_week = ["洗衣液", "卫生纸"]。
用array_merge($this_week, $next_week)合并后,结果是["鸡蛋", "大米", "洗衣液", "卫生纸"],所有物品按顺序排,编号自动从0开始,完全不会重复。
那如果数组的键名不是数字,是“自定义名字”呢?比如你把水果按种类分,$red_fruit = ["红苹果" => "红富士", "红草莓" => "丹东99"],$yellow_fruit = ["黄香蕉" => "小米蕉", "黄芒果" => "台农"],用array_merge合并后,新数组会保留所有自定义键名,不会覆盖,结果就是把四个水果都列出来,符合你的预期。
不过这里有个小细节要提:如果合并的数组里有数字键,array_merge会自动把键名重新排序,从0开始,不管原来的编号是多少。比如$a = [2 => "猫", 5 => "狗"],$b = [3 => "兔"],合并后变成["猫", "狗", "兔"],键名全变成0、1、2,适合需要“连续编号列表”的场景。
另一种情况:有重复键名时,用+运算符?
如果你的数组是“自定义键名”,而且有重复,比如$user1 = ["name" => "小明", "age" => 25],$user2 = ["age" => 28, "city" => "北京"],这时候如果用array_merge,后面数组里的重复键age会覆盖前面的,结果是["name" => "小明", "age" => 28, "city" => "北京"]。
但如果你想保留前面的键值,忽略后面重复的,就可以用$user1 + $user2,结果就是["name" => "小明", "age" => 25, "city" => "北京"]——相当于前面的收纳盒不动,后面的盒子只放“前面没有的东西”,重复的就当没看见。
不过要注意,这个+运算符,对数字键的数组效果不一样。比如$a = [0 => "苹果", 1 => "香蕉"],$b = [1 => "草莓", 2 => "芒果"],用$a + $b合并,结果是["苹果", "香蕉", "芒果"],而不是["苹果", "草莓", "香蕉", "芒果"],这是因为数字键1重复时,运算符只保留前面的,后面的被跳过了,所以这种情况不适合用+号。
避坑小总结
新手合并数组最容易踩两个坑:一是分不清什么时候用array_merge,什么时候用+号——要“合并所有元素”就用array_merge,要“保留前面、忽略后面重复”就用+号;二是数字键合并时,array_merge会自动重排编号,要是你需要保留原始编号,就得换别的方法(比如用+号,或者手动处理)。
其实就像整理购物清单,选对合并方式,就能避免买重复的东西,还能把清单理得清清楚楚。多练两次这几个函数,下次再碰到数组合并的需求,就不会慌啦。