重新认识php array_merge函数
今天因一个Bug重新审视了下array_merge()这个函数。
定义:array_merge — 合并一个或多个数组
规范:array array_merge(array $array1 [, array $...])
说明:
1. 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。
2. 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
3. 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
这个函数在手册中有详尽示例,用途也很广且实用。
今天遇到的一个问题是手册中有警告的,只是此前没注意到,导致了一个致命的错误。如下:
PHP >= 5.0 版本,array_merge() 只接受array类型的参数。不过可以用强制转换来合并其它类型。
对于是foreach等代码产生的数组变量要注意了,要么初始化该变量为空数组,要么就在合并时做个强制转换。不然,会有大苦头吃。因此,保持一个初始化变量的习惯也是个好事。
PHP中合并数组分成两种情况
1、如果这两个数组中有相同的字符串键名:
<?php $book1 = array('linux'=>'linux服务器配置与管理','php'=>'PHP程序设计'); $book2 = array('linux'=>'服务器配置与管理','jsp'=>'PHP'); $result = array_merge($book1,$book2); print_r($result); ?>
输出为:
Array ( [linux] => 服务器配置与管理 [php] => PHP程序设计 [jsp] => PHP )
说明,后者将替换前者。但如果使用的是array_merge_recursive()则可保留,并作一个子数组存在。如:
<?php $book1 = array('linux'=>'linux服务器配置与管理','php'=>'PHP程序设计'); $book2 = array('linux'=>'服务器配置与管理','jsp'=>'PHP'); $result = array_merge_recursive($book1,$book2); print_r($result); ?>
输出为:
Array ( [linux] => Array ( [0] => linux服务器配置与管理 [1] => 服务器配置与管理 ) [php] => PHP程序设计 [jsp] => PHP )
2、如果这两个数组中有相同的数值键名:
<?php $book1 = array('linux服务器配置与管理','PHP程序设计'); $book2 = array('服务器配置与管理','PHP'); $result = array_merge($book1,$book2); print_r($result); ?>
结果是:
Array ( [0] => linux服务器配置与管理 [1] => PHP程序设计 [2] => 服务器配置与管理 [3] => PHP )
这时,如果数组中包含相同的数字键名,则后面的不会覆盖前面的值,而是后面的键值按顺序依次增加,附在后边。明白了吗,^_^
1. 最简单的办法:使用 +
下列的代码:
$r1 = array('a'=>1,'b'=>3,'c'=>5,'d'=>7,'e'=>9);
$r2 = array('f'=>2,'g'=>4,'h'=>6,'i'=>8,'j'=>10);
$r = $r1+$r2;
echo '
';<br> print_r($r);<br> echo '';<br>?><br>代码输出结果:<br>Array<br>(<br> [a] => 1<br> [b] => 3<br> [c] => 5<br> [d] => 7<br> [e] => 9<br> [f] => 2<br> [g] => 4<br> [h] => 6<br> [i] => 8<br> [j] => 10<br>)<br><br>但这种办法有个需要注意的地方:两个关键字相同的元素会只保留一个,即$r1+r2,则$r1中的数据保留,这个在特殊场合也可能刚好用上也说不定。<br><br>2. 使用array_merge() 函数:<br><br><?php <br />$array1 = array("color" => "red", 2, 4);<br>$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);<br>$result = array_merge($array1, $array2);<br>print_r($result);<br>?><br>代码输出结果:<br>Array<br>(<br> [color] => green<br> [0] => 2<br> [1] => 4<br> [2] => a<br> [3] => b<br> [shape] => trapezoid<br> [4] => 4<br>)<br> <p class="header2"><span class="icon i-relatedanswer"><h3>php的函数中&是什 如函数: private function test(&$array) {}</h3></span></p><p class="best-replyer"></p> <p class="ft p1">这是函数的传址调用。$array是一个变量,传给test()的是$array的地址,函数直接改写$array的内容返回值<br> </p>