什么是数组
传统上把数组(array)定义为一组某种共同特性的元素,这里的共同特性包括相似性和类型等,每个元素由特殊的标识符来区分,这称为键(key)
PHP的数组的元素可以不为同一种类型
创建数组
PHP提供了正式和非正式的数组声明方法
- 非正式的数组声明方法
<?php //创建数组 $xiu[0] = "xiu"; $xiu[1] = "kang"; $xiu[2] = "ai"; //... $xiu[99] = "wo"; //显示数组$xiu第二个元素 echo $xiu[1];//输出 "kang" ?>
如果索引值是数值,而且还是递增的,就可以在创建时省略索引值
<?php //创建数组 $xiu[] = "xiu"; $xiu[] = "kang"; $xiu[] = "ai"; $xiu[] = "wo"; //显示数组$xiu第二个元素 echo $xiu[1];//输出 "kang" ?>
创建关联数组
<?php //创建关联数组 $xiu["sichuan"] = "deyang"; $xiu["sichuan"] = "chengdu"; $xiu["shanghai"] = "jinshan"; $xiu["shanghai"] = "baoshan"; ?>
- 用array()创建数组(正式)
array()函数接受0个或多个元素作为输入,返回一个包含这些输入元素的数组
<?php $xiu = array("xiu","kang","ai","wo"); ?>
使用array()创建关联数组
<?php $xiu = array( "sichuan"=>"deyang", "sichuan"=>"chengdu", "shanghai"=>"jinshan", "shanghai"=>"baoshan" ); ?>
- 用list()提取数组
list()与 array()类似,只是它可以在一次操作中从数组提取多个值,同时为多个变量赋值
<?php /* 打开text.txt文件 文件每一行包括用户名,密码和喜欢的颜色,每一项用竖线分隔 其中一行为 xiu|123|red */ $users = fopen("text.txt","r"); //若未达到EOF,则获取下一行(EOF=资料源无更多的资料可读取) while($line = fgets($users,4096)){ //用explode()分离数据判断 list($user,$pass,$color) = explode("|",$line); //格式化数据并输出 printf("user: %s ",$user); printf("pass:%s ",$pass); printf("color:%s <br/>",$color); } //关闭流 fclose($users); ?>
注:list()依靠函数explode()(它返回一个数组)将每一行分解为三个元素这里explode()用竖线作为元素的分隔符,然后这些元素分别赋给$user,$pass,$color
- 用预定义的值范围填充数组
<?php $xiu = range(0,20,3);//创建0-20的数组,间隔为3 //$xiu = array(0,3,6,9,12,15,18); ?>
也可以创建字母数组
<?php $xiu = range("A","E");//创建A到E的数组 //$xiu = array("A","B","C","D","E"); ?>
- 测试数组
is_array()判断某个变量是否为数组
<?php $xiu = array(); echo is_array($xiu);输出结果为1 (true) ?>
输出数组
用foreach()输出数组
<?php $xiu = array("xiu","kang","sear"); foreach($xiu as $kang){ echo "$kang<br/>"; } // 输出结果为xiu kang sear ?>
打印数组用以测试
<?php $xiu = array("xiu","kang","sear"); print_r($xiu); //输出结果为:Array ( [0] => xiu [1] => kang [2] => sear ) ?>
输出多维数组(数组的数组)
(。。。)
添加或删除数组元素
- 在数组头添加元素
array_unshift()函数在数组头添加元素,所有的数值键都会修改,关联键不受影响
<?php $xiu = array("xiu","kang"); array_unshift($xiu,"wo","ai"); //xiu = array("wo","ai","xiu","kang"); ?>
- 在数组尾添加元素
array_push()函数在数组尾添加元素,添加新值后返回数组的元素的总数
<?php $xiu = array("xiu","kang"); array_push($xiu,"ai","wo"); //xiu = array("xiu","kang","ai","wo"); ?>
- 在数组头删除元素
array_shift()函数删除并返回数组中的第一个元素,如果使用的数值键,则所有相对应的键都会下移,关联键不受影响
<?php $xiu = array("xiu","kang"); array_shift($xiu); //$xiu = array("kang"); ?>
- 在数组尾删除元素
array_pop()函数删除并返回数组中最后一个元素
<?php $xiu = array("xiu","kang"); array_pop($xiu); //$xiu = array("xiu"); ?>
定位数组元素
- 搜索数组
in_array()函数在数组中搜索特定的值,如果有这个值则返回true,否则返回false
<?php $xiu = array("xiu","kang"); //判断$xiu数组中是否有"kang"这个元素 echo in_array("kang",$xiu,"string");//返回1 第三个参数为可选,强制in_array()在搜索时考虑类型 ?>
搜索关联数组键
array_key_exists()函数搜索关联数组中指定的键,如果有这个键则返回true,否则返回false
<?php $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中"); array_key_exists("kang",$xiu); ?>
搜索关联数组值
array_search()函数搜索关联数组中指定的值,如果有这个值则返回相对应的键,否则返回false
<?php $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中"); echo array_search("抗",$xiu); ?>
- 获取数组键
<?php $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中"); array_keys($xiu);//获取$xiu数组中所有的键 array_keys($xiu,"抗");//获取$xiu数组中值为"抗"的键 ?>
- 获取数组值
<?php $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中"); array_values($xiu);//获取$xiu数组中所有的值,并自动获取对应的键 ?>
遍历数组
- 获取当前数组键
key()函数返回当前指针所在位置的键
<?php $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中"); while($key = key($xiu)){ echo "$key<br/>"; next($xiu);//将指针移到下一个元素 } ?>
- 获取当前数组值
current()函数返回数组中当前指针所在位置的数组值
<?php $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中"); while($key = current($xiu)){ echo "$key<br/>"; next($xiu);//将指针移到下一个元素 } ?>
- 移动数组指针
next()函数返回当前指针下一个位置的数组值(数组默认指针为第一个元素)
<?php $xiu = array("xiu","kang","sear"); echo next($xiu);//返回"kang" echo next($xiu);//返回"sear" ?>
prev()函数返回当前指针前一个位置的数组值,如果指针为第一个,则返回false
<?php $xiu = array("xiu","kang","sear"); echo next($xiu);//返回"kang" echo prev($xiu);//返回"xiu" ?>
reset()函数将指针移到第一个数组位置
<?php $xiu = array("xiu","kang","sear"); reset($xiu); ?>
end()函数将指针移到最后一个数组位置
<?php $xiu = array("xiu","kang","sear"); end($xiu); ?>
- 向函数传递数组值
用户自定义函数必须有两个参数,一个表示数组值,一个表示数组键
<?php function xiu($val,$key){ echo "$key**$val<br>"; } $kang = array("1"=>"2","3"=>"4","5"=>"6"); array_walk($kang,"xiu"); /* 1**2 3**4 5**6 */ ?>
确定数组的大小和唯一性
- 确定数组的大小
count()函数返回数组中值的总数
<?php $xiu = array("xiu","kang","sear"); echo count($xiu);//因为有三个值,所以返回3 ?>
sizeof()函数是count()的别名,他们的功能是一样的
- 统计数组元素出现的频次
array_count_values()函数返回一个关联数组,键表示值,值表示这个数组的值出现的次数
<?php $xiu = array("xiu","kang","kang"); $kang = array_count_values($xiu); print_r($kang);//Array ( [xiu] => 1 [kang] => 2 ) ?>
- 确定唯一的数组元素
array_unique()函数会删除数组中所有重复的值,并返回一个由唯一值组成的数组
<?php $xiu = array("xiu","kang","kang"); $kang = array_unique($xiu); foreach($kang as $sear){ echo "$sear<br/>"; //返回"xiu","kang" } ?>
数组排序
- 逆置数组元素的顺序
array_reverse()函数将数组中的元素的顺序倒叙
<?php $xiu = array("xiu","kang","sear"); $kang = array_reverse($xiu,true);//将数组倒叙,true表示将键也倒叙,关联数组不受影响 ?>
- 置换数组的键和值
array_flip()函数将数组中的键和值交换位置
<?php $xiu = array("xiu","kang","sear"); $kang = array_flip($xiu); print_r($kang);//Array ( [xiu] => 0 [kang] => 1 [sear] => 2 ) ?>
- 数组排序
sort()函数将数组的元素值进行升序(由低到高),键将会重新从0开始
rsort()函数将数组的元素值进行降序(从高到底),键将会重新从0开始
<?php $xiu = array("5","3","9"); sort($xiu);//将数组由低到高排序 print_r($xiu);//Array ( [0] => 3 [1] => 5 [2] => 9 ) ?>
asort()函数与sort()函数相同,只是保存键值对关系
arsort()函数和rsort()函数相同,只是保存键值对关系
<?php $xiu = array("a"=>"5","b"=>"3","c"=>"9"); asort($xiu);//将数组由低到高排序 print_r($xiu);//Array ( [b] => 3 [a] => 5 [c] => 9 ) ?>
natsort()函数提供了一种平常使用的排序机制,升序
natcasesort()函数与natsort()函数相同,只是不区分大小写
<?php $xiu = array("xiu3a","xiu1a","xiu2a"); natsort($xiu);//将数组由低到高排序 print_r($xiu);//Array ( [1] => xiu1a [2] => xiu2a [0] => xiu3a ) ?>
ksort()函数按键的大小排序,升序
krsort()函数按键的大小排序,降序
<?php $xiu = array("b"=>"5","a"=>"3","c"=>"9"); ksort($xiu);//将数组由低到高排序 print_r($xiu);//Array Array ( [a] => 3 [b] => 5 [c] => 9 ) ?>
shuffle()函数将对数组随机排序
<?php $xiu = array("a","b","c"); shuffle($xiu);//随机排序 print_r($xiu);//Array ( [0] => c [1] => a [2] => b ) 每次结果不一样 ?>
usort()函数自定义数组排序
(。。。)
合并,拆分,接合和分解数组
- 合并数组
array_merge()函数将两个或以上的数组进行合并,会忽略数组的键
<?php $xiu = array("a","b","c"); $kang = array("7","8","9"); $sear = array_merge($xiu,$kang);//合并数组 print_r($sear);//Array ( [0] => a [1] => b [2] => c [3] => 7 [4] => 8 [5] => 9 ) ?>
- 递归追加数组
array_merge_recursive()函数与array_merge()函数差不多
如果数组元素的键为数字则会忽略,会被重新赋值,而其他类型不会
<?php $xiu = array("a"=>"b","4"=>"d"); $kang = array("e"=>"f","7"=>"h"); $sear = array_merge_recursive($xiu,$kang);//合并数组 print_r($sear);//Array ( [a] => b [0] => d [e] => f [1] => h ) ?>
- 合并两个数组
array_combine()函数会生成一个新的数组
输入的两个数组大小必须相同,不能为空
第一个数组为键,第二个数组为值
<?php $xiu = array("a","b"); $kang = array("c","d"); $sear = array_combine($xiu,$kang); print_r($sear);//Array ( [a] => c [b] => d ) ?>
- 拆分数组
array_slice()将返回数组中的一部分
<?php $xiu = array("a","b","c","d","e","f"); $kang = array_slice($xiu,3);//拆分第三个元素之后的元素,如果是 -3 则拆分最后三个元素 print_r($kang);//Array ( [0] => d [1] => e [2] => f ) ?>
拆分第二个元素之后和最后两个元素之前的元素
<?php $xiu = array("a","b","c","d","e","f"); $kang = array_slice($xiu,2,-2,true);//拆分第二个元素之后和最后两个元素之前的元素,true表示保持数组对应的键 print_r($kang);//Array ( [0] => c [1] => d ) ?>
- 接合数组
array_splice()函数删除选择的元素
<?php $xiu = array("a","b","c","d","e","f"); $kang = array_splice($xiu,3);//删除数组中第三个元素之后的元素 print_r($kang);//Array ( [0] => d [1] => e [2] => f ) ?>
替换数组元素
<?php $xiu = array("a","b","c","d"); $kang = array_splice($xiu,2,-1,array("x","y"));//删除数组第二个元素之后和最后一个元素之前的元素,并替换为"x","y" print_r($kang);//Array ( [0] => c ) print_r($xiu);//Array ( [0] => a [1] => b [2] => x [3] => y [4] => d ) ?>
- 求数组的交集
array_intersect()返回第一个数组中且其他数组中有的值(忽略键)
array_intersect_assoc()回第一个数组中且其他数组中有的键值对(键值必须一样)
<?php $xiu1 = array("a","b","c","d"); $xiu2 = array("e","a","c","f"); $xiu3 = array("c","g","h","a"); $diff = array_intersect($xiu1,$xiu2,$xiu3); print_r($diff);//Array ( [1] => a [3] => c ) ?>
- 求数组的差集
array_diff()返回第一个数组中且其他数组中没有的值(忽略键)
array_diff_assoc()回第一个数组中且其他数组中没有的键值对(键值必须一样)
<?php $xiu1 = array("a","b","c","d"); $xiu2 = array("e","a","c","f"); $xiu3 = array("c","g","h","a"); $diff = array_diff($xiu1,$xiu2,$xiu3); print_r($diff);//Array ( [1] => b [3] => d ) ?>
其他有用的数组函数
- 返回一组随机的键
array_ranf()函数返回一组随机的键
<?php $xiu = array("a"=>"b","c"=>"d","e"=>"f"); $kang = array_rand($xiu,2);//返回2个随机的键 print_r($kang); ?>
- 对数组的的值进行求和
array_sum()函数返回数组值的合,会忽略字符串
<?php $xiu = array(3,"holle",4); echo array_sum($xiu);//返回7 ?>
- 划分数组
array_chunk()函数将数组划分成多维数组
<?php $xiu = array("a","b","c","d","e","f"); $kang = array_chunk($xiu,3);//每3个元素划分为一个多维数组里面的一个元素 print_r($kang);//Array ( [0] => Array ( [0] => a [1] => b [2] => c ) [1] => Array ( [0] => d [1] => e [2] => f ) ) ?>