|
数组概念
数组概述
学生信息
$name = "AJEST";
$sex = true;
$age = 24;
$score = 99.9;
$stu1 = $name;
$stu1 = $sex;
$stu1 = $age;
$stu1 = $score;
var_dump($stu1);
把学生信心存储在一个变量里,需要用数组来实现。
$name = "AJEST";
$sex = true;
$age = 24;
$score = 99.9;
$stu1[] = $name;
$stu1[] = $sex;
$stu1[] = $age;
$stu1[] = $score;
echo &#34;<pre>&#34;;
var_dump($stu1);
数组特点
- 键值对(key-value);
- 键,key,存储数组中,变量的“编号”。
- 值,value,存储数组中,变量的值。
- 数组中的元素可以是任意类型的数据对象。
- 索引数组,变量的“编号”是整数,整数不具备一定的语义。
- 关联数组,变量的&#34;编号&#34;用字符串表示,可以具备一定的语义。
$name = &#34;AJEST&#34;;
$sex = true;
$age = 24;
$score = 99.9;
$stu1[&#39;name&#39;] = $name;
$stu1[&#39;sex&#39;] = $sex;
$stu1[&#39;age&#39;] = $age;
$stu1[&#39;score&#39;] = $score;
echo &#34;<pre>&#34;;
var_dump($stu1);
- 复合数据类型,非线性;
- 输出数组的时候不能使echo 语句,可以使用print_r() 函数来代替。
数组创建
直接赋值
语法:
$stu1[] = $name; //默认是索引数组,从0开始计数。
$stu1[&#39;name&#39;] = $name; //key 一般是字符串,就是关联数组。
创建第二个学生信息。
$stu2[&#39;name&#39;] = &#34;HMM&#34;;
$stu2[&#39;sex&#39;] = false;
$stu2[&#39;age&#39;] = 22;
$stu2[&#39;score&#39;] = 99.9;
array 语言结构
语法:
变量 = array(变量1,变量2,...);
变量 = array(
&#39;key1&#39; => value1,
&#39;key2&#39; => value2,
...
)
- => 特殊的字符,在array 语言结构 中连接key 和value 。
- PHP 中数组的key 如果是字符串就具备一定的语义,可以非常方便的了解变量的含义。
- PHP 数组中的key ,不建议使用除了整型和字符串的其他类型。
- array() 不是函数,而是一种语言结构。
创建其他学生信息:
$stu3 = array(&#39;LL&#39;, true, 25, 59.9);
$stu4 = array(
&#39;name&#39; => &#39;LH&#39;,
&#39;sex&#39; => true,
&#39;age&#39; => 24,
&#39;score&#39; => 90.0
);
print_r($stu4);
print_r 与echo 类似,在输出布尔类型变量True 时,打印的是1;在输出False 时,打印什么都没有。
多维数组
数组中的元素可以是任何类型的数据。数组中的元素也可以是数组。
创建多维数组
一个班级有四个学生。
$ns_class = array($stu1, $stu2, $stu3, $stu4);
echo &#34;<pre>&#34;;
print_r($ns_class);
数组元素访问
数组元素操作
元素访问
通过key 找到数组中的元素。
echo &#34;HMM&#39;s score is {$stu2[&#39;score&#39;]}&#34;;
echo &#34;<br />&#34;;
echo &#34;LL&#39;s score is {$ns_class[2][3]}&#34;;
元素操作
对元素的操作包括:
数组元素操作 | 说明 | 读取 | 通过key,捕获数组中的value。 | 修改 | 直接赋值即可。 | 增加 | 直接赋值即可。 | 删除 | PHP 中删除数组中的元素意义不大,置之不理即可。 | 尝试修改数组中的元素:
echo &#34;李雷的成绩是 {$ns_class[2][3]}<br />&#34;;
echo &#34;李雷努力学习中...<br />&#34;;
$ns_class[2][3] += 0.1;
echo &#34;李雷的成绩是 {$ns_class[2][3]}&#34;;
尝试写一个座右铭:
$stu1[&#39;word&#39;] = &#34;为往圣继绝学,为万世开太平。&#34;;
var_dump($stu1);
数组的遍历
遍历数组,就是数组中的每个元素都访问一次。
for 循环
使用for 循环可以遍历数组,但是此种方法依赖于数组中key 自然数规律。
for ($i = 0; $i < count($stu1); $i++) {
echo $stu1[$i].&#34;<br />&#34;;
}
显然,此种方法具有局限性,只能遍历索引数组。
foreach 语句
foreach 语法结构提供了遍历数组的简单方式。
foreach 这种语言结构是专门用来遍历数组的,foreach 是一种循环,不需要额外计时器。
foreach ($variable as $key => $value) {
# code...
}
直接访问数组的值:
foreach ($stu2 as $v) {
echo $v.&#34;<br />&#34;;
}
访问键值对:
foreach ($stu2 as $k => $v) {
echo $k. &#34;=&#34;. $v. &#34;<br />&#34;;
}
注意:
- 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,$_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 = &#34;username=admin&#34;;
document.cookie = &#34;passoword=123456&#34;;
HTTP 请求报文:
GET /php/functions/cookie.php HTTP/1.1
Host: 10.4.7.187
Cookie: username=admin; password=123456$_REQUEST
$_REQUEST,默认包含了$_GET,$_POST,$_COOKIE 数组中的所有变量。以上提到的三个数组,包含了浏览器客户端的三大传参方式,也称GPC。
但是$_REQUEST 数组在接收参数的时候,会受到一个PHP 选项的控制。
# /php/php-5.4.45/php.ini
request_order = &#34;GP&#34;
;request_order = &#34;GPC&#34;示例代码
//request.php
var_dump($_REQUEST);
$_FILES
示例代码
示例代码:
// files.php
echo &#34;<pre>&#34;;
var_dump($_FILES);
接收的信息:
array(1) {
[&#34;uploaded&#34;]=>
array(5) {
[&#34;name&#34;]=>
string(14) &#34;1_yjh_info.jpg&#34;
[&#34;type&#34;]=>
string(10) &#34;image/jpeg&#34;
[&#34;tmp_name&#34;]=>
string(53) &#34;C:\Users\Administrator\AppData\Local\Temp\php990E.tmp&#34;
[&#34;error&#34;]=>
int(0)
[&#34;size&#34;]=>
int(14148)
}
}相关参数
变量 | 含义 | $_FILES[&#39;uploaded&#39;] | 用来保存文件上传信息的。
uploaded 就是文件域input 标签name 属性的值。 | $_FILES[&#39;uploaded&#39;][&#39;name&#39;] | 上传文件的名字。 | $_FILES[&#39;uploaded&#39;][&#39;type&#39;] | 上传文件的类型。 | $_FILES[&#39;uploaded&#39;][&#39;tmp_name&#39;] | 上传文件存储在服务器中的缓存路径。 | $_FILES[&#39;uploaded&#39;][&#39;error&#39;] | 错误代码。 | $_FILES[&#39;uploaded&#39;][&#39;size&#39;] | 上传文件的大小 |
- $_FILES 中存储的与上传文件有关的信息,不是文件本身,文件内容在缓存路径中。
- 正常完成文件上传功能,需要将文件的从缓存拷贝到服务器文件系统中。
文件上传
文件上传的实现,可以有以下步骤:
- 利用$_FILES 数组捕获文件上传信息。
- 将缓存中的文件拷贝到目标路径下。
朴素的代码:
<html>
<head>
<title>文件上传</title>
<meta charset=&#34;utf8&#34;>
</head>
<body>
<h1>文件上传测试</h1>
<form action=&#34;#&#34; method = &#34;post&#34; enctype=&#34;multipart/form-data&#34;>
<input type=&#34;file&#34; name = &#34;uploaded&#34;>
<input type=&#34;submit&#34; value=&#34;submit&#34; name=&#34;submit&#34;>
</form>
</body>
</html>
<?php
// echo &#34;<pre>&#34;;
// var_dump($_FILES);
$img_path_tmp = $_FILES[&#39;uploaded&#39;][&#39;tmp_name&#39;];
echo &#34;上传文件的缓存路径为:{$img_path_tmp}&#34;;
$img_path_target = &#34;./images/{$_FILES[&#39;uploaded&#39;][&#39;name&#39;]}&#34;;
echo &#34;上传文件的目标路径为:{$img_path_target}&#34;;
move_uploaded_file($img_path_tmp, $img_path_target);完整代码:
<html>
<head>
<title>文件上传</title>
<meta charset=&#34;utf8&#34;>
</head>
<body>
<h1>文件上传测试</h1>
<?php
// echo &#34;<pre>&#34;;
// var_dump($_FILES);
if(isset($_POST[&#39;submit&#39;])){
$img_path_tmp = $_FILES[&#39;uploaded&#39;][&#39;tmp_name&#39;];
echo &#34;上传文件的缓存路径为:{$img_path_tmp}<br />&#34;;
$img_path_target = &#34;./images/{$_FILES[&#39;uploaded&#39;][&#39;name&#39;]}&#34;;
if(move_uploaded_file($img_path_tmp, $img_path_target)){
echo &#34;文件上传成功!&#34;;
echo &#34;上传文件的目标路径为:{$img_path_target}&#34;;
}else {
echo &#34;文件上传失败!&#34;;
}
}else{
$html = <<<FORM
<form action=&#34;#&#34; method = &#34;post&#34; enctype=&#34;multipart/form-data&#34;>
<input type=&#34;file&#34; name = &#34;uploaded&#34;>
<input type=&#34;submit&#34; value=&#34;submit&#34; name=&#34;submit&#34;>
</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() |
|
|