文章目录
PHP数组
数组特点
- 键值对(key-value)。
- 键,key,存储数组中,变量的“编号”。
- 值,value,存储数组中,变量的值。
- 数组中的元素可以是任意类型的数据对象。
- 索引数组,变量的“编号”是整数,整数不具备一定的语义。
- 关联数组,变量的"编号"用字符串表示,可以具备一定的语义。
1. 索引数组
$name = "AJEST";
$sex = true;
$age = 24;
$score = 99.9;
$stu1[] = $name;
$stu1[] = $sex;
$stu1[] = $age;
$stu1[] = $score;
echo "<pre>";
var_dump($stu1);
2. 关联数组
$name = "AJEST";
$sex = true;
$age = 24;
$score = 99.9;
$stu1['name'] = $name;
$stu1['sex'] = $sex;
$stu1['age'] = $age;
$stu1['score'] = $score;
echo "<pre>";
var_dump($stu1);
- 复合数据类型,非线性。
- 输出数组的时候不能使
echo
语句,可以使用print_r()
函数来代替。
3. 数组创建
3.1 直接赋值
语法:
$stu1[] = $name; //默认是索引数组,从0开始计数。
$stu1['name'] = $name; //key 一般是字符串,就是关联数组。
3.2 array 语言结构
语法:
变量 = array(变量1,变量2,...);
变量 = array(
'key1' => value1,
'key2' => value2,
...
)
=>
特殊的字符,在array 语言结构
中连接key
和value
。- PHP 中数组的key 如果是字符串就具备一定的语义,可以非常方便的了解变量的含义。
- PHP 数组中的key ,不建议使用除了整型和字符串的其他类型。
- array() 不是函数,而是一种语言结构。
例如:
$stu3 = array('LL', true, 25, 59.9);
$stu4 = array(
'name' => 'LH',
'sex' => true,
'age' => 24,
'score' => 90.0
);
print_r($stu4);
print_r 与echo 类似,在输出布尔类型变量True 时,打印的是1;在输出False 时,什么都不打印。
4. 多维数组
数组中的元素可以是任何类型的数据。数组中的元素也可以是数组
4.1 创建多维数组
例如:一个班级有四个学生
$ns_class = array($stu1, $stu2);
echo "<pre>";
print_r($ns_class);
5. 数组元素访问
5.1 组元素操作
元素访问:通过key 找到数组中的元素。
echo $stu3[3]; # 访问索引数组
echo "<br/>";
echo $ns_class[1]["score"]; # 访问多维数组中的关联数组
5.2 元素操作
对元素的操作包括:
数组元素操作 | 说明 |
---|---|
读取 | 通过key,捕获数组中的value。 |
修改 | 直接赋值即可。 |
增加 | 直接赋值即可。 |
删除 | PHP 中删除数组中的元素意义不大,置之不理即可。 |
尝试修改数组中的元素:
echo "ls的成绩是 {$ns_class[1]["score"]}<br />";
$ns_class[1]["score"] += 0.1;
echo "ls的成绩是 {$ns_class[1]["score"]}";
5.3 数组的遍历
遍历数组,就是数组中的每个元素都访问一次
5.4 for 循环
使用for 循环可以遍历数组,但是此种方法依赖于数组中key 自然数规律。
for ($i = 0; $i < count($stu1); $i++) {
echo $stu1[$i]."<br />";
}
5.5 foreach 语句
foreach 语法结构提供了遍历数组的简单方式。
foreach 这种语言结构是专门用来遍历数组的,foreach 是一种循环,不需要额外计时器。
foreach ($variable as $key => $value) {
# code...
}
直接访问数组的值:
foreach ($stu2 as $v) {
echo $v."<br />";
}
访问键值对:
foreach ($stu2 as $k => $v) {
echo $k. " = ". $v. "<br />";
}
注意:
- foreach 是用来遍历数组的循环语言结构,数组中多少个元素,该语言结构就会循环执行几次。
- foreach 语言结构中,临时变量的名字可以变化,但是语言结构不能改变。
6. 预定义超全局数组变量
预定义,PHP 已经定义好了,已经存在的,可以直接拿过来使用。
超全局:超级全局变量,作用域是超全局,可以在脚本的任何地方访问和使用,包括函数内部、外部。
6.1 数组速查
名称 | 作用 |
---|---|
$_GET | 通过URL 参数(又叫query string)传递给当前脚本的变量的数组。 注意:该数组不仅仅对method 为 GET 的请求生效,而是会针对所有带query string 的请求。 |
$_POST | 当HTTP POST 请求的Content-Type 是application/x-www-form-urlencoded 或multipart/form-data 时,会将变量以关联数组形式传入当前脚本。 |
$GLOBALS | 关联数组array,包含当前脚本内定义成全局范围的所有变量的引用。数组的键就是变量的名字。 |
$_SERVER | 服务器和执行环境信息。 |
$_FILES | 通过HTTP POST 方式上传到当前脚本的项目的数组。此数组的概况在POST 方法上传 章节中有描述。 |
$_COOKIE | 通过HTTP Cookies 方式传递给当前脚本的变量的数组。 |
$_SESSION | 当前脚本可用 SESSION 变量的数组。更多关于如何使用的信息,参见Session 函数 文档。 |
$_REQUEST | 默认情况下包含了 G E T , _GET, GET,_POST 和$_COOKIE 的数组。 |
$_ENV | 通过环境方式传递给当前脚本的变量的数组。 |
注意:
- 以上数组都是预定义,超全局的。
- 以上数组在不同的PHP 版本中有不同的表现,但是大方向没变。
6.2 $_GET
示例代码
// get.php
var_dump($_GET);
说明:
- $_GET 是一个预定义数组。
- 作用域是超全局,脚本的任何地方都可以使用。
- 接收从浏览器客户端用户GET 方式传递到服务器的参数。
- GET 传参的参数名做$_GET 数组的key,参数值作为数组的value。
- GET 传参时,直接将参数拼接到URL 中即可。
GET 传参
GET /php/functions/get.php?username=AJEST&password=654321 HTTP/1.1
Host: localhost
示例:
<?php
echo "<pre>";
// var_dump($_GET);
print_r($_GET);
?>
浏览器URL中输入:
回车后浏览器显示效果如下:
6.3 $_POST
示例代码
// post.php
var_dump($_POST);
说明:
- $_POST 用于接收浏览器客户端用户以POST 方式传递过来的参数。
- POST 传参,参数在请求正文中。
POST 请求
POST /php/functions/post.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=AJEST&password=123456
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>wuhu</title>
</head>
<body>
<form method="post" action="5.php">
<p>
名称:<input name="user" type="text" maxlength="5">
</p>
<p>
密码:<input name="pass" type="password" >
</p>
<input type="submit" name="button" value="提交"/>
</form>
</body>
</html>
<?php
echo "<pre>";
print_r($_POST);
?>
浏览器页面显示
点击提交后页面显示如下:
6.4 $_COOKIE
为了弥补HTTP 协议的无状态性,保持用户的会话状态,需要使用Cookie 技术。
Cookie 过程:
- 用户提交账密
- 服务器进行身份认证
- 下发身份证,下发Cookie。
- 浏览器客户端用户所有的请求都会携带身份信息,携带Cookie 信息。
- 整体流程体现为,保持了HTTP 会话的状态性。
示例代码
// cookie.php
var_dump($_COOKIE);
写入Cookie
//console
document.cookie = "username=admin";
document.cookie = "passoword=123456";
HTTP 请求报文:
GET /php/functions/cookie.php HTTP/1.1
Host: 10.4.7.187
Cookie: username=admin; password=123456
示例:
使用bp抓包,修改数据包
浏览器页面显示如下:
6.5 $_REQUEST
$_REQUEST,默认包含了$_GET,$_POST,$_COOKIE 数组中的所有变量。以上提到的三个数组,包含了浏览器客户端的三大传参方式,也称GPC。
但是$_REQUEST 数组在接收参数的时候,会受到一个PHP 选项的控制。
# /php/php-5.4.45/php.ini
request_order = "GP"
;request_order = "GPC"
示例代码
//request.php
var_dump($_REQUEST);
6.6 $_FILES
示例代码:
// files.php
echo "<pre>";
var_dump($_FILES);
接收的信息:
array(1) {
["uploaded"]=>
array(5) {
["name"]=>
string(14) "1_yjh_info.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(53) "C:\Users\Administrator\AppData\Local\Temp\php990E.tmp"
["error"]=>
int(0)
["size"]=>
int(14148)
}
}
6.7 相关参数
变量 | 含义 |
---|---|
$_FILES[‘uploaded’] | 用来保存文件上传信息的。 uploaded 就是文件域input 标签name 属性的值。 |
$_FILES[‘uploaded’][‘name’] | 上传文件的名字。 |
$_FILES[‘uploaded’][‘type’] | 上传文件的类型。 |
$_FILES[‘uploaded’][‘tmp_name’] | 上传文件存储在服务器中的缓存路径。 |
$_FILES[‘uploaded’][‘error’] | 错误代码。 |
$_FILES[‘uploaded’][‘size’] | 上传文件的大小 |
- $_FILES 中存储的与上传文件有关的信息,不是文件本身,文件内容在缓存路径中。
- 正常完成文件上传功能,需要将文件的从缓存拷贝到服务器文件系统中。
6.8 文件上传
文件上传的实现,可以有以下步骤:
- 利用$_FILES 数组捕获文件上传信息。
- 将缓存中的文件拷贝到目标路径下。
代码:
<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>
说明:
-
isset():判断是否为空。
-
move_uploaded_file():用于将上传的文件移动到指定的目标位置。
7. 数组相关函数
函数 | 作用 |
count() | count($value, $mode): int |
array_count_values() | array_count_values(array $array): array |
in_array() | 检查数组中是否存在某一个元素。 此函数可以应用于黑白名单策略。 |
array_key_exists() | 用于检查数组中是否存在指定的键名 |