PHP数组

数组概念

了解PHP 中数组的概念

掌握数组的创建方法

数组概述

学生信息

1
2
3
4
5
6
7
8
9
10
11
$name = "xiu";
$sex = true;
$age = 18;
$score = 99.9;

$stu1 = $name;
$stu1 = $sex;
$stu1 = $age;
$stu1 = $score;

var_dump($stu1);

把学生信心存储在一个变量里,需要用数组来实现。

1
2
3
4
5
6
7
8
9
10
11
12
$name   = "xiu";
$sex = true;
$age = 18;
$score = 99.9;

$stu1[] = $name;
$stu1[] = $sex;
$stu1[] = $age;
$stu1[] = $score;

echo "<pre>";
var_dump($stu1);

数组特点

键值对(key-value);

键,key,存储数组中,变量的“编号”。

值,value,存储数组中,变量的值。

数组中的元素可以是任意类型的数据对象。

索引数组,变量的“编号”是整数,整数不具备一定的语义。

关联数组,变量的”编号”用字符串表示,可以具备一定的语义。

1
2
3
4
5
6
7
8
9
10
11
12
$name   = "xiu";
$sex = true;
$age = 18;
$score = 99.9;

$stu1['name'] = $name;
$stu1['sex'] = $sex;
$stu1['age'] = $age;
$stu1['score'] = $score;

echo "<pre>";
var_dump($stu1);

数组创建

直接赋值

语法:

1
2
3
$stu1[] = $name;            //默认是索引数组,从0开始计数。

$stu1['name'] = $name; //key 一般是字符串,就是关联数组。

创建第二个学生信息。

1
2
3
4
$stu2['name'] = "HMM";
$stu2['sex'] = false;
$stu2['age'] = 22;
$stu2['score'] = 99.9;

array 语言结构

语法:

1
2
3
4
5
6
7
变量 = array(变量1,变量2,...);

变量 = array(
'key1' => value1,
'key2' => value2,
...
)
  • => 特殊的字符,在array 语言结构 中连接keyvalue
  • PHP 中数组的key 如果是字符串就具备一定的语义,可以非常方便的了解变量的含义。
  • PHP 数组中的key ,不建议使用除了整型和字符串的其他类型。
  • array() 不是函数,而是一种语言结构。

创建其他学生信息:

1
2
3
4
5
6
7
8
9
10
$stu3 = array('zs', true, 25, 59.9);

$stu4 = array(
'name' => 'ls',
'sex' => true,
'age' => 24,
'score' => 90.0
);

print_r($stu4);

print_r 与echo 类似,在输出布尔类型变量True 时,打印的是1;在输出False 时,打印什么都没有。

多维数组

数组中的元素可以是任何类型的数据。数组中的元素也可以是数组。

创建多维数组

一个班级有四个学生。

1
2
3
4
$ns_class = array($stu3, $stu4);

echo "<pre>";
print_r($ns_class);

数组元素访问

数组元素访问的基本方法

掌握数组的遍历方法

数组元素操作

元素访问

通过key 找到数组中的元素。

1
2
3
echo $stu3[3];
echo "<br />";
echo $ns_class[1]["score"];

元素操作

对元素的操作包括:

数组元素操作 说明
读取 通过key,捕获数组中的value。
修改 直接赋值即可。
增加 直接赋值即可。
删除 PHP 中删除数组中的元素意义不大,置之不理即可。

尝试修改数组中的元素:

1
2
3
4
echo "ls的成绩是 {$ns_class[1]["score"]}<br />";
echo "ls努力学习中...<br />";
$ns_class[1]["score"] += 0.1;
echo "ls的成绩是 {$ns_class[1]["score"]}";

尝试写一个座右铭:

1
2
$stu1['word'] = "为往圣继绝学,为万世开太平。";
var_dump($stu1);

数组的遍历

遍历数组,就是数组中的每个元素都访问一次。

for 循环

使用for 循环可以遍历数组,但是此种方法依赖于数组中key 自然数规律。

1
2
3
for ($i = 0; $i < count($stu1); $i++) { 
echo $stu1[$i]."<br />";
}

显然,此种方法具有局限性,只能遍历索引数组。

foreach 语句

foreach 语法结构提供了遍历数组的简单方式。

foreach 这种语言结构是专门用来遍历数组的,foreach 是一种循环,不需要额外计时器。

1
2
3
foreach ($variable as $key => $value) {
# code...
}

直接访问数组的值:

1
2
3
foreach ($stu2 as $v) {
echo $v."<br />";
}

访问键值对:

1
2
3
foreach ($stu2 as $k => $v) {
echo $k. "=". $v. "<br />";
}

注意:

  • foreach 是用来遍历数组的循环语言结构,数组中多少个元素,该语言结构就会循环执行几次。
  • foreach 语言结构中,临时变量的名字可以变化,但是语言结构不能改变。

预定义超全局数组变量

了解PHP 中预定义超全局数组变量的地位

掌握相关数组的用法

概述

预定义,PHP 已经定义好了,已经存在的,可以直接拿过来使用。

超全局:超级全局变量,作用域是超全局,可以在脚本的任何地方访问和使用,包括函数内部、外部。

数组速查

名称 作用
$_GET 通过URL 参数(又叫query string)传递给当前脚本的变量的数组。 注意:该数组不仅仅对method 为 GET 的请求生效,而是会针对所有带query string 的请求。
$_POST 当HTTP POST 请求的Content-Type 是application/x-www-form-urlencoded 或multipart/form-data 时,会将变量以关联数组形式传入当前脚本。
$_FILES 通过HTTP POST 方式上传到当前脚本的项目的数组。此数组的概况在POST 方法上传 章节中有描述。
$_COOKIE 通过HTTP Cookies 方式传递给当前脚本的变量的数组。
$_SESSION 当前脚本可用 SESSION 变量的数组。更多关于如何使用的信息,参见Session 函数 文档。
$_REQUEST 默认情况下包含了$_GET,$_POST 和$_COOKIE 的数组。

注意:

  • 以上数组都是预定义,超全局的。
  • 以上数组在不同的PHP 版本中有不同的表现,但是大方向没变。

$_GET

示例代码

1
2
3
//  get.php

var_dump($_GET);

说明

  • $_GET 是一个预定义数组。
  • 作用域是超全局,脚本的任何地方都可以使用。
  • 接收从浏览器客户端用户GET 方式传递到服务器的参数。
  • GET 传参的参数名做$_GET 数组的key,参数值作为数组的value。
  • GET 传参时,直接将参数拼接到URL 中即可。

GET 传参

1
2
GET /php/functions/get.php?username=AJEST&password=654321 HTTP/1.1
Host: localhost

$_POST

示例代码

1
2
3
// post.php

var_dump($_POST);

说明:

  • $_POST 用于接收浏览器客户端用户以POST 方式传递过来的参数。
  • POST 传参,参数在请求正文中。

POST 请求

1
2
3
4
5
6
POST /php/functions/post.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=admin&password=123456

为了弥补HTTP 协议的无状态性,保持用户的会话状态,需要使用Cookie 技术。

Cookie 过程:

  • 用户提交账密
  • 服务器进行身份认证
  • 下发身份证,下发Cookie。
  • 浏览器客户端用户所有的请求都会携带身份信息,携带Cookie 信息。
  • 整体流程体现为,保持了HTTP 会话的状态性。

实例代码

1
2
3
//  cookie.php

var_dump($_COOKIE);

写入Cookie

1
2
3
//console
document.cookie = "username=admin";
document.cookie = "passoword=123456";

HTTP 请求报文:

1
2
3
GET /php/functions/cookie.php HTTP/1.1
Host: 10.4.7.187
Cookie: username=admin; password=123456

$_REQUEST

$_REQUEST,默认包含了$_GET,$_POST,$_COOKIE 数组中的所有变量。以上提到的三个数组,包含了浏览器客户端的三大传参方式。

$_FILES

参数

1
2
3
4
5
6
$_FILES['uploaded']	用来保存文件上传信息的。uploaded 就是文件域input 标签name 属性的值。
$_FILES['uploaded']['name'] 上传文件的名字。
$_FILES['uploaded']['type'] 上传文件的类型。
$_FILES['uploaded']['tmp_name'] 上传文件存储在服务器中的缓存路径。
$_FILES['uploaded']['error'] 错误代码。
$_FILES['uploaded']['size'] 上传文件的大小

$_FILES 中存储的与上传文件有关的信息,不是文件本身,文件内容在缓存路径中。

正常完成文件上传功能,需要将文件的从缓存拷贝到服务器文件系统中。

文件上传

文件上传的实现,可以有以下步骤:

  • 利用$_FILES 数组捕获文件上传信息。
  • 将缓存中的文件拷贝到目标路径下。

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html>
<head>
<title>文件上传</title>
<meta charset="utf8">
</head>
<body>
<h1>文件上传测试</h1>

<?php

// echo "<pre>";
// var_dump($_FILES);

if(isset($_POST['submit'])){
$img_path_tmp = $_FILES['uploaded']['tmp_name'];
echo "上传文件的缓存路径为:{$img_path_tmp}<br />";

$img_path_target = "./images/{$_FILES['uploaded']['name']}";

if(move_uploaded_file($img_path_tmp, $img_path_target)){
echo "文件上传成功!";
echo "上传文件的目标路径为:{$img_path_target}";
}else {
echo "文件上传失败!";
}
}else{

$html = <<<FORM
<form action="#" method = "post" enctype="multipart/form-data">
<input type="file" name = "uploaded">
<input type="submit" value="submit" name="submit">
</form>
FORM;
echo $html;
}
?>
</body>
</html>