PHP数组
概述
-
键值对(key-value);
-
键,key,存储数组中,变量的“编号”。
-
值,value,存储数组中,变量的值。
-
数组中的元素可以是任意类型的数据对象。
-
索引数组,变量的“编号”是整数,整数不具备一定的语义。
-
关联数组,变量的"编号"用字符串表示,可以具备一定的语义。
索引数组
$name = "AJEST";
$sex = true;
$age = 24;
$score = 99.9;
$stu1[] = $name;
$stu1[] = $sex;
$stu1[] = $age;
$stu1[] = $score;
echo "<pre>";
var_dump($stu1);
关联数组
$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);
数组创建
直接赋值
$stu1[] = $name; //默认是索引数组,从0开始计
数。
$stu1['name'] = $name; //key 一般是字符串,就是关联
数组。
$stu2['name'] = "HMM";
$stu2['sex'] = false;
$stu2['age'] = 22;
$stu2['score'] = 99.9;
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**是一个语言结构,用于输出一个或多个字符串或变量的值。它在打印简单变量时更常见,不会提供复杂数据结构的详细信息。当使用echo直接输出一个数组时,它会尝试将数组转换为字符串并输出。具体地说,它会将数组的内容用逗号分隔,并将其转换为一个字符串进行输出。
$arr = array('apple', 'banana', 'cherry');
echo $arr;
输出结果
Array
可以看到,echo直接输出了字符串Array,而不是数组的具体内容。这是因为echo无法将数组直接转换为字符串并输出。
如果你想要输出数组的内容,可以使用print_r函数或var_dump函数来打印数组的详细信息,或者使用循环来遍历数组并逐个输出数组元素
多维数组
数组中的元素可以是任何类型的数据。数组中的元素也可以是数组。
创建多维数组
上面已经创建了$stu1, $stu2, $stu3, $stu4等数组
$ns_class = array($stu1, $stu2, $stu3, $stu4);
echo "<pre>";
print_r($ns_class);
数组元素访问
元素访问
通过key找到数组中的元素
echo "HMM's score is {$stu2['score']}";
echo "<br />";
echo "LL's score is {$ns_class[2][3]}";
元素操作
对元素的操作包括:
数组元素操作 | 说明 |
---|---|
读取 | 通过key,捕获数组中的value。 |
修改 | 直接赋值即可。 |
增加 | 直接赋值即可。 |
删除 | PHP 中删除数组中的元素意义不大,置之不理即可。 |
尝试修改数组中的元素:
echo "李雷的成绩是 {$ns_class[2][3]}<br />";
echo "李雷努力学习中...<br />";
$ns_class[2][3] += 0.1;
echo "李雷的成绩是 {$ns_class[2][3]}";
尝试写一个座右铭:
$stu1['word'] = "为往圣继绝学,为万世开太平。";
var_dump($stu1);
数组的遍历
遍历数组,就是数组中的每个元素都访问一次。
for 循环
使用for 循环可以遍历数组,但是此种方法依赖于数组中key 自然数规律。
for ($i = 0; $i < count($stu1); $i++) {
echo $stu1[$i]."<br />";
}
显然,此种方法具有局限性,只能遍历索引数组。
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 语言结构中,临时变量的名字可以变化,但是语言结构不能改变。
预定义超全局数组变量
- 了解PHP 中预定义超全局数组变量的地位
- 掌握相关数组的用法
概述
预定义,PHP 已经定义好了,已经存在的,可以直接拿过来使用。
超全局:超级全局变量,作用域是超全局,可以在脚本的任何地方访问和使用,包括函数内部、外部。
数组速查
名称 | 作用 |
---|---|
$_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 | 默认情况下包含了GET,_GET,GET,_POST 和$_COOKIE 的数组。 |
$_ENV | 通过环境方式传递给当前脚本的变量的数组。 |
注意:
- 以上数组都是预定义,超全局的。
- 以上数组在不同的PHP 版本中有不同的表现,但是大方向没变。
$_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
$_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
$_COOKIE
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
$_REQUEST
REQUEST,默认包含了_REQUEST,默认包含了REQUEST,默认包含了_GET,POST,_POST,POST,_COOKIE 数组中的所有变量。以上提到的三个数组,包含了浏览器客户端的三大传参方式,也称GPC。
但是$_REQUEST 数组在接收参数的时候,会受到一个PHP 选项的控制。
# /php/php-5.4.45/php.ini
request_order = "GP"
;request_order = "GPC"
示例代码
//request.php
var_dump($_REQUEST);
$_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)
}
}
相关参数
变量 | 含义 |
---|---|
$_FILES[‘uploaded’] | 用来保存文件上传信息的。 uploaded 就是文件域input 标签name 属性的值。 |
$_FILES[‘uploaded’][‘name’] | 上传文件的名字。 |
$_FILES[‘uploaded’][‘type’] | 上传文件的类型。 |
$_FILES[‘uploaded’][‘tmp_name’] | 上传文件存储在服务器中的缓存路径。 |
$_FILES[‘uploaded’][‘error’] | 错误代码。 |
$_FILES[‘uploaded’][‘size’] | 上传文件的大小 |
- $_FILES 中存储的与上传文件有关的信息,不是文件本身,文件内容在缓存路径中。
- 正常完成文件上传功能,需要将文件的从缓存拷贝到服务器文件系统中。
文件上传
文件上传的实现,可以有以下步骤:
- 利用$_FILES 数组捕获文件上传信息。
- 将缓存中的文件拷贝到目标路径下。
朴素的代码:
<html>
<head>
<title>文件上传</title>
<meta charset="utf8">
</head>
<body>
<h1>文件上传测试</h1>
<form action="#" method = "post" enctype="multipart/form-data">
<input type="file" name = "uploaded">
<input type="submit" value="submit" name="submit">
</form>
</body>
</html>
<?php
// echo "<pre>";
// var_dump($_FILES);
$img_path_tmp = $_FILES['uploaded']['tmp_name'];
echo "上传文件的缓存路径为:{$img_path_tmp}";
$img_path_target = "./images/{$_FILES['uploaded']['name']}";
echo "上传文件的目标路径为:{$img_path_target}";
move_uploaded_file($img_path_tmp, $img_path_target);
完整代码:
<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>
数组相关函数
- 掌握数组相关函数的查询方法
- 了解相关函数用法
函数 | 作用 |
---|---|
count() | count($value, $mode): int |
array_count_values() | array_count_values(array $array): array |
in_array() | 检查数组中是否存在某一个元素。 此函数可以应用于黑白名单策略。 |
array_key_exists() | |
array_search() |