6.9 合并、拆分、接合和分解数组

本节介绍的函数能完成一些更复杂的数组处理任务,例如,接合和合并多个数组、从数组元素中提取一部分,以及完成数组比较.

/*********************************************
* PHPfans系列教程:
* http://www.phpfans.net/bbs/forumdisplay.php?fid=25
* 作 者: 我不是鱼
* Email:[email protected]
* 博 客:  http://www.phpfans.net/space/?2
*********************************************/

array array_merge ( array array1 [, array array2 [, array ...]] )
array_merge()将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组.

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值.然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面.
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引.

示例:

[复制到剪切板]
CODE:
<?php
$array1 
= array(=> "php爱好者站");
$array2 = array(=> 'www.phpfans.net');
$result array_merge($array1$array2);
print_r($result);
?> ;


输出:
Array
(
    [0] => php爱好者站
    [1] => www.phpfans.net
)
可以看到数字键名被重新编号了

如果你想完全保留原有数组并只想新的数组附加到后面,用 + 运算符:

示例:

[复制到剪切板]
CODE:
<?php
//PHPfans站系列教程:
//http://www.phpfans.net/bbs/forumdisplay.php?fid=25
$array1 = array(=> "php爱好者站");
$array2 = array(=> 'www.phpfans.net');
$result $array1 $array2;
print_r($result);
?> ;


输出:
Array
(
    [1] => php爱好者站
    [3] => www.phpfans.net
)
array_merge_recursive()

array_merge_recursive()函数与array_merge()相同,可以将两个或多个数组合并在一起,形成一个联合的数组.两者之间的区别在于,当某个输入数组中的某个键已经存在于结果数组中时会以怎样的处理方式.array_merge()会覆盖前面存在的键/值对,替换为当前输入数组中的键/值对,而array_merge_recursive()将把两个值合并在一起,形成一个新的数组,并以现有的键作为数组名.示例如下:

示例:

[复制到剪切板]
CODE:
<?php
$array1 
= array('welcome' =>'欢迎光临''name' => "phpfans");
$array2 = array('name' => 'php爱好者站''url' => 'www.phpfans.net');

$result1 array_merge($array1$array2);
print_r($result1);

echo 
"\n";

$result2 array_merge_recursive($array1$array2);
print_r($result2);
?> ;


输出:
Array
(
    [welcome] => 欢迎光临
    [name] => php爱好者站
    [url] => www.phpfans.net
)

Array
(
    [welcome] => 欢迎光临
    [name] => Array
        (
            [0] => phpfans
            [1] => php爱好者站
        )

    [url] => www.phpfans.net
)
说了数组的合并,如何将数组的所有元素合并成一个字符串呢?php中提供了方便的函数implode.

implode(string glue, array pieces)
本函数将数组的内容组合成一个字符串,参数 glue 是字之间的分隔符号.

示例

[复制到剪切板]
CODE:
<?php 
$arr
['name'] = 'php爱好者站';
$arr['teach'] = '系列教程';
$arr['url'] = 'www.phpfans.net';

$str implode(',',$arr);
echo 
$str;
?> ;


输出
php爱好者站,系列教程,www.phpfans.net
join 是 implode 的别名


array_chunk ( array input, int size [, bool preserve_keys] )
将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定.最后一个数组的单元数目可能会少几个.得到的数组是一个多维数组中的单元,其索引从零开始.
将可选参数 preserve_keys 设为 TRUE,可以使 PHP 保留输入数组中原来的键名.如果你指定了 FALSE,那每个结果数组将用从零开始的新数字索引.默认值是 FALSE.

示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

print_r(array_chunk($arr,2));
echo 
"\n";
print_r(array_chunk($arr,2,true));
?> ;


输出:
Array
(
    [0] => Array
        (
            [0] => www.phpfans.net
            [1] => www.php.net
        )

    [1] => Array
        (
            [0] => www.mysql.com
            [1] => www.apache.org
        )

)

Array
(
    [0] => Array
        (
            [phpfans] => www.phpfans.net
            [php] => www.php.net
        )

    [1] => Array
        (
            [mysql] => www.mysql.com
            [apache] => www.apache.org
        )

)
array_slice ( array $array, int $offset [, int $length [, bool $preserve_keys]] )

array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列.

如果 offset 非负,则序列将从 array 中的此偏移量开始.如果 offset 为负,则序列将从 array 中距离末端这么远的地方开始.

如果给出了 length 并且为正,则序列中将具有这么多的单元.如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方.如果省略,则序列将从 offset 开始一直到 array 的末端.
注意 array_slice() 默认将重置数组的键.自 PHP 5.0.2 起,可以通过将 preserve_keys 设为 TRUE 来改变此行为.

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'www.phpfans.net',
   
'www.php.net',
   
'www.mysql.com',
   
'www.apache.org'
);

$array1 array_slice($arr,0,2);
$array2 array_slice($arr,-3,2);
$array3 array_slice($arr,-3,2,true);

print_r($array1);
echo 
"\n";
print_r($array2);
echo 
"\n";
print_r($array3);
?> ;


输出:
Array
(
    [0] => www.phpfans.net
    [1] => www.php.net
)

Array
(
    [0] => www.php.net
    [1] => www.mysql.com
)

Array
(
    [1] => www.php.net
    [2] => www.mysql.com
)
array array_splice ( array &$input, int $offset [, int $length [, array $ replacement ]] )

array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代.返回一个包含有被移除单元的数组.注意 input 中的数字键名不被保留.

如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除.如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除.

如果省略 length,则移除数组中从 offset 到结尾的所有部分.如果指定了 length 并且为正值,则移除这么多单元.如果指定了 length 并且为负值,则移除从 offset 到数组末尾倒数 length 为止中间所有的单元.小窍门:当给出了 replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length.

如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代.如果 offset 和 length 的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置.注意替换数组中的键名不保留.如果用来替换的值只是一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组.

示例:

[复制到剪切板]
CODE:
<?php 
//PHPfans站系列教程:
//http://www.phpfans.net/bbs/forumdisplay.php?fid=25
$arr = array(
   
'www.phpfans.net',
   
'www.php.net',
   
'www.mysql.com',
   
'www.apache.org'
);
$arr1 $arr;
$array1 array_splice($arr1,2);
print_r($arr1);
echo 
"\n";
print_r($array1);
echo 
"\n";

$arr2 $arr;
array_splice($arr2,2,1);
print_r($arr2);
echo 
"\n";

$arr3 $arr;
$arr_replacement = array('php爱好者','php官方');
array_splice($arr3,2,1,$arr_replacement);
print_r($arr3);
?> ;


输出:
Array
(
    [0] => www.phpfans.net
    [1] => www.php.net
)

Array
(
    [0] => www.mysql.com
    [1] => www.apache.org
)

Array
(
    [0] => www.phpfans.net
    [1] => www.php.net
    [2] => www.apache.org
)

Array
(
    [0] => www.phpfans.net
    [1] => www.php.net
    [2] => php爱好者
    [3] => php官方
    [4] => www.apache.org
)
array_intersect ( array $array1, array $array2 [, array $ ...] )

array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值.注意键名保留不变.

示例:

[复制到剪切板]
CODE:
<?php 
$arr1 
= array('phpfans'=>'www.phpfans.net','MySQL','apache');
$arr2 = array('php爱好者'=>'www.phpfans.net','MySQL','javascript','ajax');

$new_arr array_intersect($arr1,$arr2);
print_r($new_arr);
?> ;


输出:
Array
(
    [phpfans] => www.phpfans.net
    [0] => MySQL
)
array_intersect_assoc()

函数array_intersect_assoc()与array_intersect()基本相同,只不过它在比较中还考虑了数组的键.因此,只有在input_array1中出现,且在所有其他输入数组中也出现的键/值对才返回到结果数组中.

[复制到剪切板]
CODE:
<?php 
$arr1 
= array('phpfans'=>'www.phpfans.net','MySQL','apache');
$arr2 = array('php爱好者'=>'www.phpfans.net','MySQL','javascript','ajax');

$new_arr array_intersect_assoc($arr1,$arr2);
print_r($new_arr);
?> ;


输出:
Array
(
    [0] => MySQL
)
另外,
array_sum()函数将input_array中的所有值加在一起,返回最终的和.array_diff array_diff_assoc 是计算差集,还有其他的一些函数这里就不坐介绍了,大家查手册熟知.
如履薄冰