PHP数组
数组是⼀种抽象的数据类型,类似于
Python
语⾔中的列表和字典的组合。
数组的基本概念
- PHP 中的数组实际上是⼀个有序映射。映射是⼀种把 values 关联到 keys 的类型。此类型在很多⽅⾯做了优化,因此可以把它当真正的数组,或列表(向量),散列表(是映射的⼀种实 现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另⼀个数组,树形结构和多维数组也是允许的。
<?php
//对于PHP来说这三个变量是没有任何关系的
$stu1 = "wxkun";
$stu2 = 20;
$stu3 = 60.1;
$w = $stu1;
$w = $stu2;
$w = $stu3;
var_dump($w); //float 60.1
?>
需要数组 来实现
- 数组的基本概念
-
复合数据类型
-
键值对( key-value )
-
key 存储进来变量的 " 编号 " ,
-
value 存储进来的变量的值
-
索引数组 变量的 " 编号 " 是整数,数组不具备⼀定的语义。
-
关联数组 变量的 " 编号 " ⽤字符串表示,可以具备⼀定的语义。这种⽅式也是 PHP 中最常⽤的 ⽅式。
-
- 注意
- 关联数组极⼤提供了PHP 开发的便利性。
- echo 语句不能够输出数组,可以使⽤ print_r() 函数输出数组。
数组创建
-
变量名称 [ 索引值 ]= 数据 ;
-
变量名称 []= 数据 ;// 不写索引值默认是数值数组,从 0 开始
<?php
$name = "wxkun";
$age = 20;
$sex = true;
$score = 60.1;
$stu1[] = $name;
$stu1[] = $age;
$stu1[] = $sex;
$stu1[] = $score;
var_dump($stu1); //array(4) { [0]=> string(5) "wxkun" [1]=> int(20) [2]=> bool(true) [3]=> float(60.1) }
echo "<hr />";
$stu2['name'] = "Hmm";
$stu2['age'] = 24;
$stu2['sex'] = false;
$stu2['score'] = 85;
var_dump($stu2); //array(4) { ["name"]=> string(3) "Hmm" ["age"]=> int(24) ["sex"]=> bool(false) ["score"]=> int(85) }
?>
方法二:array语言结构
<pre>
<?php
$stu1 = array("wxkun",true,24,60.1);
var_dump($stu1);
echo "<hr / >";
$stu2 = array(
1 => "Mdm",
2 => false,
3 => 20,
4 => 89.9
);
var_dump($stu2);
echo "<hr />";
$stu3 = array(
'name' => "Xialuo",
'sex' => true,
'age' => 25,
'score' => 59.9
);
var_dump($stu3);
?>
/*array(4) {
[0]=>
string(5) "wxkun"
[1]=>
bool(true)
[2]=>
int(24)
[3]=>
float(60.1)
}
array(4) {
[1]=>
string(3) "Mdm"
[2]=>
bool(false)
[3]=>
int(20)
[4]=>
float(89.9)
}
array(4) {
["name"]=>
string(6) "Xialuo"
["sex"]=>
bool(true)
["age"]=>
int(25)
["score"]=>
float(59.9)
}*/
数组元素的访问
-
通过运算符 [key] ,访问(读取、修改、增加)数组元素。 PHP 数组删除元素,意义不是特别⼤。
-
通过运算符 [key] 访问到了数组元素,就可以直接进⾏读写。
<meta charset = "utf-8">
<?php
$stu1 = array("wxkun",true,24,60.1);
$stu1['pj'] = "good!"; //增加
var_dump($stu1);
echo "<br />";
unset($stu1['pj']); //删除
echo "学⽣{$stu1[0]}的成绩是{$stu1[3]}<br />";
$nl = 10;
if($nl){
$stu1[3]+=$nl;//对数组元素进⾏重新赋值,
}else{
--$stu1[3];
}
echo "学⽣{$stu1[0]}的成绩是{$stu1[3]}<br />";
print_r($stu1);
?>
多维数组
- 数组中的元素是数组。
- 数组中的元素可以是任何类型 的数据。
<pre >
<?php
$stu1 = array("wxkun",true,24,60.1);
$stu2 = array(
1 => "Mdm",
2 => false,
3 => 20,
4 => 89.9
);
$stu3 = array(
'name' => "Xialuo",
'sex' => true,
'age' => 25,
'score' => 59.9
);
$students = array(
'stu' => array("Hmm",false,22,63.3),
'stu1' => $stu1,
'stu2' => $stu2,
'stu3' => $stu3
);
//var_dump($students);
//print_r($students);
echo "The score of Xl is {$students['stu3']['score']}"
?>
数组的遍历
遍历数组:数组中的每个元素都访问一次。
for循环
利用for循环是可以遍历数组的,但是无法关联数组通常情况下遍历数组的时候,也不会采取这种方法。
foreach语句
foreach 语法结构 提供了简单的遍历数组的方式
- 基本结构
<?php
foreach($arr as $key => $value){ //$arr 是数组
//$key 是数组中的key
//$value 是数组中的value
//其中$key 和$value 的变量名可以变化
//但是位置不能变化
//代码块
}
foreach($arr as $value){
//代码块
}
?>
预定义超全局数组变量
- 预定义:PHP 已经定义好了(存在)的数组变量(存放的数据的类型是数组)。 超全局:超级全局变量,作⽤域(有效区域)是全局,可以函数内部、外部都可以进⾏访问。
数组速查
$GLOBALS
<pre>
<?php
$name = "wxkun";
//var_dump($GLOBALS);
//echo $GLOBALS['name'];
function test(){
echo $GLOBALS['name'];
}
test(); //AJEST
?>
$_SRVER
<pre>
<?php
print_r($_SERVER);
?>
$_GET
-
$_GET 是⼀个数组 .
-
作⽤域是超全局,不需在脚本内部定义或初始化,即可使⽤。
-
接收从浏览器客户端 GET ⽅式( URL 中)传递到服务器的参数。
-
GET 传参的参数名 name 做 $_GET 数组的 key ,参数值 AJEST 作为数组的 value 。
-
GET 传参时,直接将参数拼接到 URL 中即可。
$_POST
-
⽤于接收浏览器客户端 POST ⽅式传递过来的参数。
-
POST 传参,参数在请求正⽂中。
-
GET 传参 " 可⻅ " , POST 传参 " 不可⻅ " 。以 HTTP 协议通信,都是明⽂的。
-
如何发送 POST 请求呢?
-
利⽤表单
-
利⽤ hackbar
-
利⽤ Burp Suite 的 Repeater 模块
-
<?php
//form.php
?>
<meta charset = "utf-8"> <h1>⽤户登录</h1> <form
action = "./post.php"
method = "post"
target = "_blank"
>
⽤户名:<input type = "text" name = "uName" />
密码:<input type = "text" name = "uPass" />
<input type = "submit" name = "submit" value = "登录">
</form>
<pre>
<?php
//post.php
var_dump($_POST);
?>
$_FILES
⽤来接收上传的⽂件相关信息,⽽不是⽂件的内容,⽂件是字节流。
<!-- upfile.php -->
<meta charset = utf-8> <h1>⽂件上传测试</h1> <form
method = "post"
action = "./files.php"
enctype = "multipart/form-data"
target = "_blank"
><input type = "file" name = "upFile"> <input type = "submit" name = "submit" value="上传⽂件">
</form>
<?php
//files.php
sleep(10);
var_dump($_FILES);
?>
-
$_FILES['upFile'] ,⽤来保存⽂件上传信息的。 upFile 实际上是表单中⽂件域的 name 属性
-
$_FILES['upFile']['name'] ,上传⽂件的名字。
-
$_FILES['upFile']['type'] ,上传⽂件的类型。
-
$_FILES['upFile']['tmp_name'] ,上传⽂件存储在服务器中的缓存路径。
-
$_FILES['upFile']['error'] ,错误代码。
-
$_FILES['upFile']['size'] ,上传⽂件的⼤⼩
$_COOKIE
Cookie
是存储在浏览器中,⽤来标识身份认证信息的,它会随着浏览器的请求⽽发送到服务器。服务器要通过
Cookie
识别⽤户身份,就需要接收
Cookie
信息,并进⾏⼀系列身份判断。
PHP
中⽤来接收
Cookie
信息(参数,键值对)的预定义超全局数组是
$_COOKIE
。
<?php
//cookie.php
var_dump($_COOKIE);
?>
- document.cookie
//console
document.cookie = "name=admin";
-
Burp Suite
$_REQUEST
$_REQUEST
,默认包含了
$_GET
,
$_POST
,
$_COOKIE
数组中的所有变量。
以上提到的三个数组,包含了浏览器客户端的三⼤传参⽅式,也称
"GPC"
。$_REQUEST
数组在接收参数的时候,会受到⼀个
PHP
选项的控制。
request_order = "GPC"
$_ENV
<pre >
<?php
//env.php
//php 5.2.17
var_dump($_ENV);
?>
处理数组的相关函数
count()
统计数组中单元个数,或者对象中属性个数。
$blackList = array('exe','php','aspx','jsp');
echo count($blackList);//4
array_count_values()
统计所有元素出现的次数,返回一个数组。
$arr = array(1,"hello",1,'world','world',1);
print_r(array_count_values($arr));
/*
Array
(
[1] => 3
[hello] => 1
[world] => 2
)
*/
in_array()
检查数组中是否存在某一个值,区分大小写
$blackList = array('exe','php','aspx','jsp');
var_dump(in_array('exe',$blackList));//bool(true)
array_search()
再数组中搜索给定的值,如果成功返回⾸个相应的
key
。
$blackList = array('exe','php','aspx','jsp');
echo array_search('php',$blackList); //1
array_key_exists()
$blackList = array('exe','php','aspx','jsp');
var_dump(array_key_exists(100,$blackList)); //bool(false)
可以去找的东西往往是找不到的,
天下万物的来和去都有他的时间。