0%

数组的定义,遍历,预定义数组、数组相关处理函数

数组的概述

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$a[0]=1;
$a[1]=2;
$a[2]=3;

$b[]=1; //不定义下标默认从0开始
$b[]=2;
$b[]=3;
$b[6]=4; //定义下标为6的值
$b[]=5; //后面的顺延下标为7

var_dump($a);
echo "<br>---------------<br>";
var_dump($b);
?>

页面显示结果:

image

示例2:

下标定义为字符串的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$a["name"]="zhang";
$a["sex"]="man";
$a["age"]=23;

$b["name"]="lisi";
$b[]="woman"; //不定义下标默认为0
$b["age"]=28;
$b[8]=4; //定义下标为8的值
$b[]=5; //后面的顺延下标为9

var_dump($a);
echo "<br>---------------<br>";
var_dump($b);
?>

页面显示结果:

image

使用array()结构新建数组

  • 基本格式:
    1
    2
    3
    array([key=>]value,...) 
    //key可以是数字或字符串
    //value可以是任意值
  • 如果键名是一个int类型的标准表达方法,则被解释为整数(例如 8 将被解释为 8,而 “08” 将被解释为 “08”)。key中的浮点数被取整为 intPHP 中没有不同的数字下标和关联下标数组,数组的类型只有一种,它可以同时包含整型和字符串型的下标。
  • 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

示例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$a=array(1,2,3,4,5,6);
$b=array("one", "two", "three");
$c=array(0=>"aaa",1=>"bbb",2=>"ccc");
$d=array("aaa",6=>"bbb","ccc");
$e=array("name"=>"zhang", "age"=>20);

var_dump($a);
echo "<br>---------------<br>";
var_dump($b);
echo "<br>---------------<br>";
var_dump($c);
echo "<br>---------------<br>";
var_dump($d);
echo "<br>---------------<br>";
var_dump($e);
echo "<br>---------------<br>";
?>

页面显示结果:

image

使用[] 定义数组

示例:

1
2
3
$a = [10,20,30,40,50];
$b = [0=>10,1=>20,2=>30];
$c = ["name"=>"zhangsan","age"=>20];

多维数组的声明

多维数组的声明方式及规则,与一维数组相同,例如:下面二维数组的声明片段:

1
2
3
4
<php 
$a = ['1','2',['1','2','3']];
var_dump($a);
?>

页面显示结果:

image

数组的遍历

使用for语句遍历数组

1
2
3
4
5
6
7
8
<?php
//下标 0 1 for 2 3 4 5 6 10 11 12
$arr=array(1, 3, "for"=>4, 5, 6, 7, 8,9,10=>"aa","bb", "cc");

for($i=0; $i<count($arr); $i++){ //使用count得到数组的总数遍历
echo "\$arr[".$i."]=".$arr[$i]."<br>";
}
?>

image

下标为7,8,9的不存在所以报错

使用foreach语句遍历数组

1
2
3
4
5
6
7
<?php
$arr=array(1, 3, "for"=>4, 5, 6, 7, 8,9,10=>"aa","bb", "cc");

foreach ($arr as $k => $v) {
echo "\$arr[".$k."]=".$v."<br>";
}
?>

image

使用foreach循环不会报错

联合使用list()、each()和while循环遍历数组

两种写法:

写法1:

1
2
3
4
5
6
<?php
$fruit= array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
while (list($key, $val) = each($fruit)) {
echo "$key => $val\n";
}
?>

写法2:

1
2
3
4
5
6
7
<?php
$arr=array("one"=>"aaa", "two"=>"bbb", "three"=>"cccc");
while($sz=each($arr)){
//echo $sz[0]."===>".$sz[1]."<br>";
echo $sz["key"]."===>".$sz["value"]."<br>";
}
?>

image

使用数组内部指针控制函数遍历数组

定义一个数组如下:

1
$info = [1,2,3,4,5,6,7,8,9];
  • next():将指针向后移动一位
    1
    2
    var_dump(next($info));
    //输出int(2)
  • prev():将指针向前移动一位
    1
    2
    var_dump(prev($info));
    //指针向前移动一位是-1,所以输出bool(false)
  • end():将指针指向数组中最后一个元素
    1
    2
    var_dump(end($info));
    //输出最后一个元素,int(9)
  • reset():将指针指向数组中第一个元素
    1
    2
    var_dump(reset($info));
    //输出第一个元素,int(1)
  • current():不会移动数组内部指针
    1
    2
    var_dump(current($info));
    //输出默认指针值,也就是第一位。int(1)
  • key():返回数组内部指针当前指向元素的键名
    1
    2
    3
    4
    5
    6
    7
    var_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);

image

环境变量:$_ENV

1
2
3
4
var_dump($_ENV);
//没有环境变量,输出
//array(0) {
//}

HTTP GET变量:$_GET

获取到GET请求内容

1
var_dump($_GET);

image

HTTP POST变量:$_POST

获取到POST请求内容

同目录下创建一个test.php文件,以POST请求提交一个id参数到index.php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
header("Content-Type:text/html;charset=utf-8");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="./index.php" method="post">
<input type="text" name="name" id="">
<input type="submit" value="提交">
</form>
</body>
</html>

index.php文件中输出POST请求内容:

1
var_dump($_POST);

访问test.php提交一个参数:

image

image

REQUEST变量:$_REQUEST

获取到所有请求头GET,POST,COOKIE

1
var_dump($_REQUEST);

HTTP文件上传变量:$_FILES

获取文件上传变量

修改test.php中的form表单为文件上传

1
2
3
4
<form action="./index.php" method="post" enctype="multipart/form-data">
<input type="file" name="name" id="">
<input type="submit" value="提交">
</form>

访问test.php文件随便上传一个文件

image

index.php文件中输出提交文件的参数

1
var_dump($_FILES);

image

获取COOKIE变量输出

1
var_dump($_COOKIE);

SESSION变量:$_SESSION

获取SESSION变量输出

1
2
3
//这里一定要开启session_start()
session_start();
var_dump($_SESSION);

GLOBAL变量:$GLOBALS

获取全局参数

1
var_dump($GLOBALS);

image

数组的相关处理函数

数组的键/值操作函数

  • 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]."&nbsp;"; //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
    2
    var_dump(count($a));
    //输出int(10)
  • array_count_values:统计数组中所有的值出现的次数
    1
    2
    var_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
    2
    var_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
    9
       var_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
    8
    function 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
    8
       function 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
    3
       array_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
    3
       shuffle($a);
    var_dump($a);
    //数组打乱输出