在技术交流群里聊天引起的反思。
一个工作四五年的phper竟然在被面试官问到“标题”这样的问题的时候不知道如何回答???他的原话是老记但是记不住;
死记硬背显然是走不通的,下面的就是按照自己理解来的;
直接上代码:
1、两个数组都是索引数组【下标是从0开始的,自己分配的下标】
<?php
$a = ['php','java'];
$b = ['mysql','redis','kafka'];
echo '<pre>';
print_r($a + $b);
echo '<pre>';
print_r(array_merge($a,$b));
结果:
<pre>Array
(
[0] => php
[1] => java
[2] => kafka
)//很显然:这里的[0][1]的值是$a的值,而[2]的值是$b的值;也就是说$a,$b中下标相同的话选取的是$a的值,在加$b中下标跟$a不同的值;
<pre>Array
(
[0] => php
[1] => java
[2] => mysql
[3] => redis
[4] => kafka
)//而这里,就是将$a,$b两个数组合并然后从下标0开始组成数组;
2、当有一个数组为索引数组,而另一个为关联数组的时候
<?php
$a = ['php','java','a'=>'golang'];
$b = ['mysql','redis','kafka'];
echo '<pre>';
print_r($a + $b);
echo '<pre>';
print_r(array_merge($a,$b));
结果:
<pre>Array
(
[0] => php
[1] => java
[a] => golang
[2] => kafka
)//发现$a,$b如果下标相同的话,还是取$a的值,在加上$a,$b中下标不同的值;
<pre>Array
(
[0] => php
[1] => java
[a] => golang
[2] => mysql
[3] => redis
[4] => kafka
)//$a ,$b的值全都取出来,然后从下标0开始排
3、当两个数组都为关联数组【使用自己分配给数组的键的数组】
<?php
$a = ['php','java','a'=>'golang'];
$b = ['mysql','a'=>'redis','kafka'];
echo '<pre>';
print_r($a + $b);
echo '<pre>';
print_r(array_merge($a,$b));
结果:
<pre>Array
(
[0] => php
[1] => java
[a] => golang
)//发现此时还是$a的所有的值,即使$a和$b都有下标为['a']的
<pre>Array
(
[0] => php
[1] => java
[a] => redis
[2] => mysql
[3] => kafka
)//发现此时的值有了变化,$a和$b中下标为数字的[索引]从0开始的,而下标为字符串的[关联]的则是$b里面的值覆盖了$a里面的值
4、混合双打
<?php
$a = ['php','java','a'=>'golang','5'=>'python'];
$b = ['mysql','a'=>'redis','kafka'];
echo '<pre>';
print_r($a + $b);
echo '<pre>';
print_r(array_merge($a,$b));
结果:
Array
(
[0] => php
[1] => java
[a] => golang
[5] => python
)//发现下标相同的取得是$a的值
<pre>Array
(
[0] => php
[1] => java
[a] => redis
[2] => python
[3] => mysql
[4] => kafka
)//发现$a,$b下标为数字的从0开始,哪怕python的下标你已经标好了['5'],也得从0开始,而下标为字符串的则是$b的值替换了$a的值
总结啦…………
array_merge()将一个或者多个数组合并为一个数组;合并之后从下标为0开始,无论你是否规定了下标[除了关联数组的键值]
- array + array :下标相同时,把最先出现的值作为返回结果,后出现的直接“抛弃”不管了;
- array_merge():如果下标都为数字的话[索引数组],后出现的值不会覆盖原来的值,将所有的值都从下标为0开始排序;
如果下标有字符串的话[关联数组],相同下标的后面出现的值则会覆盖最先出现的值,剩下的下标不是字符串的则从下标为0开始排序;