数组的本质是存储,管理和操作一组变量。数组也是PHP中最重要的数据类型之一,属于复合类型,在PHP中的应用非常广泛。
数组
在PHP中根据数组索引值的不同可将数组分为:索引数组和关联数组。前者的索引值是整数,从0开始,以次递增,后者的索引值是字符串。
定义数组
在PHP中定义一个数组有两种方法:1、可使用array()函数声明数组,2、直接为数组元素赋值即可声明数组。
//为数组元素直接赋值声明数组。
$arr1['one'] = 'one';
$arr1['two'] = 'two';
$arr1['three'] = 'three';
//使用array()函数声明数组
$arr2 = array('one','two','three');
//自PHP5.4起可以使用短数组定义,即使用[]代替array()
$arr3 = ['one'=>'one','two'=>'two','three'=>'three'];
var_dump($arr1);// array(3) { ["one"]=> string(3) "one" ["two"]=> string(3) "two" ["three"]=> string(5) "three" }
var_dump($arr2);// array(3) { [0]=> string(3) "one" [1]=> string(3) "two" [2]=> string(5) "three" }
var_dump($arr3);// array(3) { ["one"]=> string(3) "one" ["two"]=> string(3) "two" ["three"]=> string(5) "three" }
数组常用函数
1.数组大小
在PHP中求数组的长度可用count函数(sizeof函数是count函数的别名)。count函数用法:
count($
var[,$mode
] )。参数$var 用于计算长度的数组,可选参数$mode设为
COUNT_RECURSIVE
(或 1),
count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。
mode
的默认值是
0。
<?php
$array1 = array('one'=>'1','two'=>'2','three'=>'3','four'=>'4',5=>5);
$array2 = array('one'=>'1',2=>'2','three'=>'3','four'=>'7');
$array3 = array($array1,$array2);
echo count($array1); //5
echo '<br/>';
echo sizeof($array2); //4
echo '<br/>';
echo count($array3,1); //11
2.数组遍历
遍历数组可以使用for循环和foreach函数,使用for语句只能遍历连续数字索引的一维数组,但是在PHP中不仅有非连续的数字索引值,还存在以字符串为下标的关联数组。所以在PHP中很少使用for语句去遍历数组。我们更多的是使用foreach函数去遍历数组,foreach函数用法:foreach(数组 as 键名=>键值)或foreach(数组 as 键值)。
<?php
$array1 = array('one'=>'1','two'=>'2','three'=>'3','four'=>'4',5=>5);
$array2 = array('one'=>'1',2=>'2','thee'=>'3','fore'=>'7');
//使用for语句去遍历非连续数字索引会报错。
for($i = 0; $i < count($array1);$i++){
echo $array1[$i];
}
echo '<br/>';
foreach($array1 as $v){
echo $v." "; //1 2 3 4 5
}
echo '<br/>';
foreach($array1 as $k=>$v){
echo $k."=>".$v.','; //one=>1,two=>2,three=>3,four=>4,5=>5,
}
3.数组排序
数组中的元素能够根据索引值和元素值以字母或数字的顺序进行升序或降序排序。
/* PHP 常用排序函数
* sort()--以升序对数组排序
* rsort()--以降序对数组排序
* asort()--根据值,已升序对关联数组进行排序。
* ksort()--根据键,已升序对关联数组进行排序。
* arsort()--根据值,以降序对关联数组进行排序。
* krsort()--根据键,以降序对关联数组进行排序。
* usort()--将用用户自定义的比较函数对一个数组中的值进行排序。
* uasort()--使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
* array_multisort--对多个数组或多维数组进行排序。
*/
sort()函数用法: bool sort(array &array[,int $sort_flags])。第一参数是必需的,指定用于排序的数组;第二个参数可选,指定排序方式。
$array1 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F','5'=>'D');
sort($array1);
print_r($array1); //Array ( [0] => A [1] => B [2] => C [3] => D [4] => F )
rsort函数用法与sort()函数一致,只不过是以降序进行排序。
$array1 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F','5'=>'D');
rsort($array1);
print_r($array1); //Array ( [0] => F [1] => D [2] => C [3] => B [4] => A )
注意:使用sort()函数和rsort函数时原始的键名将被忽略,依次使用数字重新索引数组的下标。若想保留原有键值关系可使用asort函数和arsort()函数。
$array1 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F','5'=>'D');
asort($array1);
print_r($array1); //Array ( [two] => A [three] => B [one] => C [5] => D [four] => F )
arsort($array1);
print_r($array1); // Array ( [four] => F [5] => D [one] => C [three] => B [two] => A )
上面说的结果排序函数都是对值进行排序,但好些时候我们会根据键名进行排序,PHP中ksort()函数和krsort()函数便可以对键名进行排序。
$array1 = array('C','A','B','F','D');
ksort($array1);
print_r($array1); //Array ( [0] => C [1] => A [2] => B [3] => F [4] => D )
krsort($array1);
print_r($array1); //Array ( [4] => D [3] => F [2] => B [1] => A [0] => C )
usort()、uasort()和uksort()等函数提供通过创建自己的比较函数作为回调函数对数组进行排序,它们的使用方式一样。
$array1 = array([1,2,3],[4,5,6,7],[8,9,10,11,12]);
function cm($n , $m){
if(count($n) == count($m)){
return 0;
}else{
count($n) > count($m) ? 1 : -1;
}
}
usort($array1,'cm');
foreach($array1 as $v){
print_r($v);
echo '<br/>';
}
/*
Array ( [0] => 8 [1] => 9 [2] => 10 [3] => 11 [4] => 12 )
Array ( [0] => 4 [1] => 5 [2] => 6 [3] => 7 )
Array ( [0] => 1 [1] => 2 [2] => 3 )
*/
4.键值相关函数
array_values()函数用于返回数组中所有的值并给其建立数字索引。可将关联数组转化为索引数组。
$array1 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F','5'=>'D');
array_values($array1);
print_r(array_values($array1)); //Array ( [0] => C [1] => A [2] => B [3] => F [4] => D )
array_keys()函数的作用是返回数组中的键名。 array array_keys ( array
$input
[,
$search_value
[,
$strict
]] )
参数$input
一个数组,包含了要返回的键。
search_value
如果指定了这个参数,只有包含这些值的键才会返回。
strict
是否该使用严格的比较(===)。
$array1 = array('one'=>10,'two'=>20,'three'=>30,'four'=>"10");
print_r(array_keys($array1)); //Array ( [0] => one [1] => two [2] => three [3] => four )
print_r(array_keys($array1, '10')); //Array ( [0] => one [1] => four )
print_r(array_keys($array1,'10',true)); //Array ( [0] => four )
in_array()函数的作用是检测数组中是否存在某个值。返回true或false。
$array1 = array('one'=>'10','two'=>'20','three'=>'30');
var_dump(in_array(10,$array1)); //bool(true)
var_dump(in_array(10,$array1,true)); //bool(false)
array_flip()函数返回一个交换键和值的数组。如果一个值多次出现,则最后一个键名将作为它的值,前面出现的元素将被覆盖。注意:需要交换的数组元素值必须能够作为合法的键名(字符创或整型),函数将会报错。
$array1 = array('one'=>'10','two'=>'20','three'=>'30');
var_dump(array_flip($array1)); //array(3) { [10]=> string(3) "one" [20]=> string(3) "two" [30]=> string(5) "three" }
array_count_values()函数用于统计数组中所有值出现的次数。注意:此函数并不按严格类型进行统计。
$array1 = array('one'=>'10','two'=>'20','three'=>'30','four'=>10);
print_r(array_count_values($array1));//Array ( [10] => 2 [20] => 1 [30] => 1 )
array_unique函数用于删除数组中重复的值,并返回没有重复值的新数组。 array_unique() 先将值作为字符串排序, 然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的
array
中同一个值的第一个出现的键名会被保留。 注意:此函数并不按严格类型进行统计。
$array1 = array('one'=>'10','two'=>'20','three'=>'30','four'=>10);
print_r(array_unique($array1));//Array ( [one] => 10 [two] => 20 [three] => 30 )
5.拆分,合并,分解
array_slice()函数的作用是在数组中根据条件取出一段值并返回。
array_slice()函数使用
array
array_slice(
array
$array
,
int $offset
[,
int $length
[,
bool$preserve_keys
]])。参数$array,表示用于抽取的数组,参数$offset,表示抽取元素开始的位置。如果是正数,则从前往后取,若是负数则从后往前去。参数$length,表示被返回数组的个数,若未设置该值,则返回所有元素。
$preserve_keys表示是否保留原有的键名,true则保留,false(默认值)则重新设置索引值。注意:若数组有字符串键名,则返回的数组将保留键名。
$array1 = array('one'=>'10','two'=>'20','three'=>'30','four'=>10);
print_r(array_slice($array1,1,2));//Array ( [two] => 20 [three] => 30 )
$array1 = array('10','20','30',10);
print_r(array_slice($array1,1,2));// Array ( [0] => 20 [1] => 30 )
print_r(array_slice($array1,1,2,true));// Array ( [1] => 20 [2] => 30 )
array_merge()将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的)。
$array1 = array('one'=>'10','two'=>'20','three'=>'30','four'=>10);
$array2 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F','5'=>'D');
print_r(array_merge($array1,$array2)); //Array ( [one] => C [two] => A [three] => B [four] => F [0] => D )
array_intersect()函数用于计算数组的交集,返回在所有参数数组中同时出现的值。注意键名保留不变。
$array1 = array('one'=>'10','two'=>'20','three'=>'30','four'=>10);
$array2 = array('one'=>'10','two'=>'20','three'=>'30','four'=>'F','5'=>'D');
print_r(array_intersect($array1,$array2)); //Array ( [one] => 10 [two] => 20 [three] => 30 [four] => 10 )
array_diff()函数:
array
array_diff (
array$array1
,
array$array2
[,
array$...
] )返回在
array1
中但是不在
array2
及任何其它参数数组中的值。
$array1 = array('one'=>'10','two'=>'20','three'=>'30','four'=>10);
$array2 = array('one'=>'10','two'=>'20','three'=>'30','four'=>'F','5'=>'D');
print_r(array_diff($array2,$array1)); //Array ( [four] => F [5] => D )
6.其他函数
array_rand()函数从数组中随机选出一个或多个元素并返回。mixed array_rand( array $input
[,
int $num_req
= 1 ] )
num_req参数指定选取出的元素个数。
$array2 = array('one'=>'10','two'=>'20','three'=>'30','four'=>'F','5'=>'D');
print_r(array_rand($array2,2)); //每次刷新结果都会不同。
array_sum()函数返回数组中所有值的总和。注意:不能类型转换数值类型的值将不参与计算。
$array2 = array('one'=>'10','two'=>'20','three'=>'30','four'=>true,'5'=>'D');
print_r(array_sum($array2));//61
range()函数创建并返回一个包含指定范围的数组。 array range ( mixed
$start
,
mixed$limit
[,
number$step
= 1 ] )返回的数组中从
start
到
limit
的单元,包括它们本身。
step
的值,它将被作为单元之间的步进值。
step
应该为正值。如果未指定,
step
则默认为 1。
$array2 = array('one'=>'10','two'=>'20','three'=>'30','four'=>true,'5'=>'D');
print_r(range(0,5)); //Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 )