数组的概述
PHP
中的数组实际上是一个有序图。图是一种把 values
映射到 keys
的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,队列以及更多可能性。因为可以用另一个 PHP
数组作为值,也可以很容易地模拟树。
- 数组下标:可以视为资料内容在此数组中的识别名称,通常被称为数组下标。
- 当索引值为数值时,也代表此资料内容在数组中的储存位置。
- 数组中有几个索引值就被称为几维数组。
- 数据分类:在PHP中有两种数组,索引数组和关联数组。
- 索引(indexed)数组的索引值是整数,以0开始。当通过位置来标识东西时用索引数组。
- 关联(associative)数组以字符串做为索引值,关联数组更像操作表。索引值为列名,用于访问列的数据。
数组的定义
由于 PHP
是属于弱类型数据,因此源代码中的数组并不需要经过特别的声明操作,直接将一组数值指定给某一数组元素即可。一般情况下数组的赋值有三种方式:
- 直接赋值方式如:
1
2$a[0]='spam@126.com';
$a[1]='abuse@sohu.com'; - 使用
array
函数如:1
$a=array("spam@126.com","abuse@sohu.com");
- 使用
[]
如:1
$a=["spam@126.com","abuse@sohu.com"];
直接赋值的方式声明数组
基本格式:$数组变量名[索引值]=资料内容
其中索引值(下标)可以是一个字符串或一个整数。等价于整数(不以0开头)的字符串值被当作整数对待。因此,数组$array[3]
与$array['3']
是引用相同的元素。但是$array['03']
引用的另外不同的元素。
示例1:
分别定义两个数组$a
和$b
,看看区别:
1 | <?php |
页面显示结果:
示例2:
下标定义为字符串的使用:
1 | <?php |
页面显示结果:
使用array()结构新建数组
- 基本格式:
1
2
3array([key=>]value,...)
//key可以是数字或字符串
//value可以是任意值 - 如果键名是一个
int
类型的标准表达方法,则被解释为整数(例如 8 将被解释为 8,而 “08” 将被解释为 “08”)。key
中的浮点数被取整为int
。PHP
中没有不同的数字下标和关联下标数组,数组的类型只有一种,它可以同时包含整型和字符串型的下标。 - 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
示例1:
1 | <?php |
页面显示结果:
使用[] 定义数组
示例:
1 | $a = [10,20,30,40,50]; |
多维数组的声明
多维数组的声明方式及规则,与一维数组相同,例如:下面二维数组的声明片段:
1 | <php |
页面显示结果:
数组的遍历
使用for语句遍历数组
1 | <?php |
下标为7,8,9的不存在所以报错
使用foreach语句遍历数组
1 | <?php |
使用foreach
循环不会报错
联合使用list()、each()和while循环遍历数组
两种写法:
写法1:
1 | <?php |
写法2:
1 | <?php |
使用数组内部指针控制函数遍历数组
定义一个数组如下:
1 | $info = [1,2,3,4,5,6,7,8,9]; |
next()
:将指针向后移动一位1
2var_dump(next($info));
//输出int(2)prev()
:将指针向前移动一位1
2var_dump(prev($info));
//指针向前移动一位是-1,所以输出bool(false)end()
:将指针指向数组中最后一个元素1
2var_dump(end($info));
//输出最后一个元素,int(9)reset()
:将指针指向数组中第一个元素1
2var_dump(reset($info));
//输出第一个元素,int(1)current()
:不会移动数组内部指针1
2var_dump(current($info));
//输出默认指针值,也就是第一位。int(1)key()
:返回数组内部指针当前指向元素的键名1
2
3
4
5
6
7var_dump(key($info));
//输出键名,int(0)
//如果数组改为
$info = ['aa'=>1,2,3,4,5,6,7,8,9];
var_dump(key($info));
//输出键名,string(2) "aa"
预定义数组
服务器变量:$_SERVER
$_SERVER
是一个包含诸如头信息header
、路径path
和脚本位置script locations
等一系列服务器变量的数组。
1 | var_dump($_SERVER); |
环境变量:$_ENV
1 | var_dump($_ENV); |
HTTP GET变量:$_GET
获取到GET
请求内容
1 | var_dump($_GET); |
HTTP POST变量:$_POST
获取到POST
请求内容
同目录下创建一个test.php
文件,以POST
请求提交一个id参数到index.php
文件
1 | <?php |
index.php
文件中输出POST
请求内容:
1 | var_dump($_POST); |
访问test.php
提交一个参数:
REQUEST变量:$_REQUEST
获取到所有请求头GET,POST,COOKIE
1 | var_dump($_REQUEST); |
HTTP文件上传变量:$_FILES
获取文件上传变量
修改test.php
中的form
表单为文件上传
1 | <form action="./index.php" method="post" enctype="multipart/form-data"> |
访问test.php
文件随便上传一个文件
index.php
文件中输出提交文件的参数
1 | var_dump($_FILES); |
HTTP COOKIES变量:$_COOKIE
获取COOKIE
变量输出
1 | var_dump($_COOKIE); |
SESSION变量:$_SESSION
获取SESSION
变量输出
1 | //这里一定要开启session_start() |
GLOBAL变量:$GLOBALS
获取全局参数
1 | var_dump($GLOBALS); |
数组的相关处理函数
数组的键/值操作函数
array_values
:返回数组中所有的值1
2
3
4
5$a = array("name"=>"张三","age"=>20,"sex"=>"男");
$values = array_values($a);
var_dump($values);
//array(3){[0]=>string(4)"张三" [1]=>int(20) [2]=>string(2)"男"}array_keys
:返回数组中所有的键名1
2
3
4
5$a = array("name"=>"张三","age"=>20,"sex"=>"男");
$keys = array_keys($a);
for($i=0;$i<count($keys);$i++){
echo $keys[$i]." "; //name age sex
}in_array
:检查数组中是否存在某个值1
2
3
4$a = array("name"=>"张三","age"=>20,"sex"=>"男");
if(in_array("张三",$a)){
echo " ‘张三’在\$a数组中"; //”张三“在$a数组中
}array_flip
:交换数组中的键和值1
2
3
4
5$a = array("name"=>"张三","age"=>20,"sex"=>"男");
$b = array_flip($a);
foreach($b as $k=>$v){
echo "$k=>$v"; // 张三=>name 20=>age 男=>sex
}array_reverse
:返回一个单元顺序相反的数组1
2
3
4
5$a = array("name"=>"张三","age"=>20,"sex"=>"男");
$b = array_reverse($a);
foreach($b as $k=>$v){
echo "$k=>$v"; // sex=>男 age=>20 name=>张三
}统计数组元素的个数与唯一性
定义一个数组:1
$a = [1,2,3,4,5,6,6,7,8,4];
count
:统计数组的长度1
2var_dump(count($a));
//输出int(10)array_count_values
:统计数组中所有的值出现的次数1
2var_dump(array_count_values($a));
//输出array(8) { [1]=> int(1) [2]=> int(1) [3]=> int(1) [4]=> int(2) [5]=> int(1) [6]=> int(2) [7]=> int(1) [8]=> int(1) }array_unique
:数组去重1
2var_dump(array_unique($a));
//输出array(8) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [7]=> int(7) [8]=> int(8) }使用回调函数处理数组的函数
定义一个数组:1
$a = [1,2,3,4,5,6,6,7,8,4];
array_filter
:用回调函数过滤数组中的单元,键值保持不变1
2
3
4
5
6
7
8
9var_dump(array_filter($a,'test'));
function test($id){
if($id == 4){ //只保留值为4的
return true;
}
return false;
var_dump(func_get_args());
}
//输出array(2) { [3]=> int(4) [9]=> int(4) }array_walk
:对数组中的每个成员应用用户函数1
2
3
4
5
6
7
8function myfunction(&$value,$key)
{
$value="yellow"; //将数组a的所有值改为yellow
}
$a=array("a"=>"red","b"=>"green","c"=>"blue");
array_walk($a,"myfunction");
var_dump($a);
//输出array(3) { ["a"]=> string(6) "yellow" ["b"]=> string(6) "yellow" ["c"]=> string(6) "yellow" }array_map
:将函数作用到数组中的每个值上,并返回带有新值的数组1
2
3
4
5
6
7
8function myfunction($v)
{
return($v*$v); //每个值都乘以本身
}
$a=array(1,2,3,4,5);
var_dump(array_map("myfunction",$a));
//返回array(5) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) [4]=> int(25) }数组的排序函数
sort
:对数组排序(升序)rsort
:对数组逆向排序(降序)usort
:使用用户自定义的比较函数对数组中的值进行排序asort
:对数组进行排序并保持索引关系(关联数组排序)arsort
:对数组进行逆向排序并保持索引关系uasort
:用户自定义的比较函数对数组进行排序并保持索引关联ksort
:对数组按照键名排序krsort
:对数组按照键名逆向排序uksort
:使用用户自定义的比较函数对数组中的键名进行排序natsort
:用“自然排序”算法对数组排序natcasesort
:用“自然排序”算法对数组不区分大小写字母排序array_multisort
:对多个数组或多维数组进行排序
拆分、合并、分解与结合数组
array_splice
:把数组中的一部分去掉并用其它值取代1
2
3
4$a = [1,2,3,4,5,6,6,7,8,4]; //定义一个数组a
array_splice($a,0,5,[10]); //把数组下标从0-5的所有值去掉替换为10
var_dump($a);
//输出array(6) { [0]=> int(10) [1]=> int(6) [2]=> int(6) [3]=> int(7) [4]=> int(8) [5]=> int(4) }array_combine
:创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值1
2
3
4
5$k = ['key1','key2'];
$v = ['value1','value2'];
$a = array_combine($k,$v);
var_dump($a);
//输出array(2) { ["key1"]=> string(6) "value1" ["key2"]=> string(6) "value2" }array_merge
:将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
1
2
3
4
5$k = ['key1','key2'];
$v = ['value1','value2'];
$a = array_merge($k,$v);
var_dump($a);
//输出array(4) { [0]=> string(4) "key1" [1]=> string(4) "key2" [2]=> string(6) "value1" [3]=> string(6) "value2" }array_intersect
:计算数组的交集,返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。array_diff
:计算数组的差集,返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。
数组与数据结构
定义一个数组:
1 | $a = [1,2,3,4,5,6,6,7,8,4]; |
array_pop
:将数组最后一个单元弹出(出栈)1
2$a = array_pop($a);
var_dump($a); //输出int(4)array_push
:将一个或多个单元压入数组的末尾(入栈)1
2
3array_push($a,10); //将10插入数组末尾
var_dump($a);
//输出array(11) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(6) [7]=> int(7) [8]=> int(8) [9]=> int(4) [10]=> int(10) }array_shift
:将数组开头的单元移出数组array_unshift
:在数组开头插入一个或多个单元
其他有用的数组处理函数
array_rand
:从数组中随机取出一个或多个单元1
2
3$a = array_rand($a);
var_dump($a);
//随机输出一个数组a的值,每次刷新基本值都会变shuffle
:将数组打乱1
2
3shuffle($a);
var_dump($a);
//数组打乱输出