无意中看到一道面试题:
似曾相识,但是不会做(惭愧!)
于是立马搜索了一下,下面举个例子:
$a = [
'y' => 'yy',
1,
2,
3,
'a' => 'aa',
'b' => 'bb'
];
$b = [
20,
2,
3,
4,
5,
'a'=> 'aaa',
'c' =>'ccc',
6
];
$c = $a + $b;
$d = array_merge($a,$b);
( 注:var_dump($a) ====> array(6) { ["y"]=> string(2) "vv" [0]=> int(1) [1]=> int(2) [2]=> int(3) ["a"]=> string(2) "aa" ["b"]=> string(2) "bb" } )
( 注:var_dump($b) ====> array(8) { [0]=> int(20) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) ["a"]=> string(3) "aaa" ["c"]=> string(3) "ccc" [5]=> int(6) } )
一、对于数组相加来说比较简单,无论是数组键还是字符键,键相同的时候:首先出现的键保留值,后面出现的丢弃,并且数字键会重新排序。
于是var_dump($c);
array(10) { ["y"]=> string(2) "vv" [0]=> int(1) [1]=> int(2) [2]=> int(3) ["a"]=> string(2) "aa" ["b"]=> string(2) "bb" [3]=> int(4) [4]=> int(5) ["c"]=> string(3) "ccc" [5]=> int(6) }
果然,由于$a中 1,2,3与$b中的20,2,3含有相同的数字键,于是$b中的被覆盖。同理字符键aa,也被覆盖。其他没事。最后结果数字键重新排序,完事。
二、对于array_merge也不难记,就是对于数字键来说,相同时候,不发生覆盖,最后数字键会重新排序。但是如果字符键相同时,后出现的覆盖先出现的(与数组相加相反)。
于是var_dump($d);
array(13) { ["y"]=> string(2) "vv" [0]=> int(1) [1]=> int(2) [2]=> int(3) ["a"]=> string(4) "aaa" ["b"]=> string(2) "bb" [3]=> int(20) [4]=> int(2) [5]=> int(3) [6]=> int(4) [7]=> int(5) ["c"]=> string(3) "ccc" [8]=> int(6) }
数字键相同的不管。这里就一个字符键相同,取后面那个,数字键重新排序,好了。
于是上面题目选 D