PHP 简介05-数组/正则/时间函数

1.数组

1.数组

1.分类

​ 索引数组:键为 int

​ 关联数组:键为 string

​ 混合数组:键为 混合类型(字母,数字,汉字,字符串….)

2.键:

​ 别名:下标,偏移量,索引

3.值:

​ 可以为任意类型

4.格式:

$数组名[ 键 ] = 值;

$数组名 = [ 键1 => 值1,键2 => 值2,键3 => 值3,... ];

5.索引数组

​ 1)数组的键为一系列有一定规律的数字组成,当键不是 int 型时,会强制转化为 int 。

​ 2)当没有指定键时:默认从0开始;从已有记录过的最大键开始+1;

6.关联数组

​ 1)数组的键为字符串组成,没有特别的顺序和规律

​ 2)如下一些键值可能会产生同样的效果:

# 1 = 1.xxx =true

# 0 = 0.0 = '0' = false

# null = 空字符串 = 未定义变量

# 非法键:数组,对象

# 资源虽然可以作为键,但是不推荐

​ 键既有数字,又有字符串,一般称之为混合数组

7.多维数组

​ 数组间发生嵌套关系,即可称之为多维数组

​ 多维数组的操作,需要操作几维数组,就需要几个[ ]

1
2
3
4
5
6
$name=[
['成龙', '洪金宝', '李连杰', '周润发'],
['易筋经', '洗 髓经', '金钟罩', '童子功'],
['象猴得度', '普度众生', '割肉喂鹰', '佛说前生'],
];

另一个写法:

1
2
$name=['a'=>[1,2,3,4,5,],'b'=>[2,3,4,5,6,6]];

8.遍历数组

1.索引遍历 for

对于键为有规则的数字,可以用索引遍历

1
2
3
4
5
6
$name = ['貂蝉', '西施', '王昭君', '杨玉环'];
for($i=0; $i<4; $i++){
echo $name[$i].' ';
}
var_dump($name);

2.指针遍历 point

对于没有规则的数字键,是很难通过for遍历出来

常用函数:

key( ) 返回当前指针所指向的键

current( ) 返回当前指针所指向的值

​ 相对移位:

next( ) 下移一位

prev( ) 上移一位

​ 绝对移位:

reset( ) 指针直接指向数组的第一个键值对

end( ) 指针直接指向数组的最后一个键值对

注意点:

当使用 next 和 prev 移出范围之外时,无法通过next和prev再移动回来,返回键为 null ,值为 false。

一般使用键为null来作为遍历终止条件

1
2
3
4
5
6
7
$name = [4=>'貂蝉', 1=>'西施', 99=>'王昭君', 12=>'杨玉环'];
// 利用指针 来遍历数组
for( ; !is_null( key($name) ) ; next($name) ){
echo current($name).' ';
}


3.指针遍历 each

each()函数自带current+key+next

1
2
3
4
5
6
7
8
$name = [4=>'貂蝉', 1=>'西施', 99=>'王昭君', 12=>'杨玉环'];

for( ; $x = each($name) ; ){
echo $x[0].'=======>'.$x[1].'<br>';
}
echo '<hr>'; #输出形式:0=key;1=value。


4.扩展循环结构: foreach

格式:

foreach( 数组 as 键 => 值 ){ 代码块 }

简化版:当不需要使用键时

foreach( 数组 as 值 ){ 代码块 }

1
2
3
4
5
6
7
$name = [4=>'貂蝉', 1=>'西施', 99=>'王昭君', 12=>'杨玉环'];

foreach($name as $k => $v){
echo $k.'=======>'.$v.'<br>';
}


2.预定义数组

1.$GLOBALS 存储全局环境中所有的可用变量

2.$_GET 接收所有以get方式传输的值

3.$_POST 接收所有以post方式传输的值

4.$_FILES 专门用于接收上传文件

5.$_COOKIE 存储浏览器中的cookie值

6.$_SESSION 存储服务器中的session值(不重复登录)

7.$_REQUEST 同时接收get,post,cookie 的值

8.$_SERVER 存储服务器相关的信息,包含地址,IP,服务器环境等

1
2
3
4
5
6
7
8
9
10
var_dump($_SERVER)
# $_SERVER['HTTP_HOST'] 主机地址
# $_SERVER['HTTP_USER_AGENT'] 客户端的信息(设备, 浏览器信息)
# $_SERVER['REMOTE_ADDR'] 客户端的IP地址 (常见面试题)
# $_SERVER['HTTP_REFERER'] 获取上一级来源地址(你是从哪个页面来的)
# $_SERVER['REQUEST_URI'] 脚本地址(带参数)
# $_SERVER['QUERY_STRING'] 获取参数
# $_SERVER['SCRIPT_NAME'] 脚本地址(不带参数)


9.当 method=get , action带参数时,action 的参数会被全部抛弃

​ 解决方案:将 action 的参数通过隐藏域进行传递

1
2
3
4
5
6
7
8
9
<form action="http://localhost/s86/0416/09-server.php?name=999&age=99" method="get">
<input type="text" name="age">
<input type="hidden" name="name" value="999">
<input type="hidden" name="age" value="99">
<input type="submit">
</form>



10.上传文件

三个必要条件:

  • file表单必须要有name,用以在PHP端接收内容
  • form表单中 method = post
  • form表单中 enctype=multipart/form-date

单文件上传:

<input type="file" name="xxx">

多文件上传:

​ 1.需要在name值得最后面加 [ ],形成数组接收多内容

​ 2.file 添加 multiple 属性

3.字符串数组

把字符串当做数组来使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$str = 'i love you';

echo $str[0];
echo $str[1];
echo $str[2];
echo $str[3];
// ...
echo $str[9];

# 已经超出字符串范围
echo @$str[10];
var_dump( @$str[10] ); # 空字符串
echo '<hr>';

// for($i=0; $i<10; $i++){
// echo $str[$i];
// }

for($i=0; @$str[$i] !== '' ; $i++){
echo $str[$i];
}



2.正则表达式

1.定义:正则表达式就是用某种模式去匹配字符串的公式

2.功能:主要用于字符串的查询,替换操作

3.组成:由正规字符和一些特殊字符组成

4.特征:

  • 小而强大 的控制源(正则集的代数)
  • 存储大
  • 读取快

1正则语法规则:

包含:定界符,原子,元字符,模式修正符

2.定界符:

表示一个正则表达式的开始和结束,有以下三种方式:

  • / [0-9] / 一对斜线
  • #[0-9]# 一对井号
  • {[0-9]} 一对大括号

3.原子:

表达式中代表一个匹配单元的个体,分为可见原子和不可见原子

不可见原子:

  • 换行符 \n
  • 回车 \r
  • 制表符 \t
  • 空格
  • 其他不可见符号

4.元字符

1)原子的筛选方式:

  • | 匹配两个或多个分支选择
  • [ ] 匹配方括号中的任意一个原子
  • [^] 匹配除了方括号中的原子之外的任意字符

2)原子的集合(将某一类原子归类简化)

  • . 匹配除换行符之外的任意字符
  • \d 匹配任意一个十进制数字,即[0-9]
  • \D 匹配任意一个非十进制数字,即[^0-9]
  • \s 匹配一个不可见原子,即[\n\t\r]
  • \S 匹配一个可见原子,即[^\n\t\r]
  • \w 匹配一个数字、字母或下划线,即[0-9a-zA-Z_]
  • \W 匹配一个非数字、字母或下划线,即[^0-9a-zA-Z_]

3)量词(查找字符串中某个原子连续出现多少次)

  • {n} 表示其前面的原子出现n次
  • {n,} 表示其前面的原子至少出现n次
  • {n,m} 表示其天免得原子出现了n~m次
  • * 匹配0次,1次或者多次其前的原子,即{0,}
  • + 匹配1次或者多次其前的原子,即{1,}
  • ? 匹配0次或者1次其前的原子,即{0,1}

4)便捷控制,模式单元和模式选择符

  • ^ 匹配字符串开始的位置
  • $ 匹配字符串结尾的位置
  • ( ) 匹配其中的整体为一个原子
  • (|) 匹配其中的两个或者更多的选择之一,分隔多选一模式

5.模式修正符

  • 贪婪匹配

    .* 匹配结果存在歧义时取其长(默认)

  • 懒惰匹配

    U 匹配结果存在歧义时取其短,同.*?

  • 忽略空白

    x 匹配结果忽略空白

  • 大小写匹配

    i 匹配结果不区分大小写

  • 中文适配

    u 把中文汉字当做一个字符计算

6.正则的基本使用

正则在PHP中就是字符串类型

1.函数:

1)preg_match(正则,字符串 [,匹配结果]) (单词匹配函数)

​ 返回值:匹配的次数(0-失败;1-成功)

2)preg_match_all(正则,字符串 [,匹配结果]) (全部匹配函数)

​ 返回值:字符串中匹配字符的个数

3)preg_replace(正则,替换值,对象) (替换匹配字符串函数)

​ 返回值:替换之后的对象

4)preg_grep(正则,数组) (过滤函数)

​ 返回值:符合过滤条件的字符串

2.后向引用

\1 代表将第一个()内的内容复制到 \1 所在的位置

\2 代表将第一个()内的内容复制到 \2 所在的位置

\n 代表将第一个()内的内容复制到 \n 所在的位置

3.分组概念:()模式单元

​ 在正则中,一旦匹配()的内容,会产生两个效果

​ 1)将()内的内容当成一个整体,以一个大原子的形式看待

​ 2)将()内的内容送入子模式匹配

​ 参与子模式匹配,方便后向引用

若只是单纯想将()内容当成一个整体,不想让()内容参与子模式,可以取消子模式:(?:正则内容)

4.中文

中文在PHP中默认占3位,模式修正符 u 可以将中文当做一位.

若要统计字符串中有多少汉字,可以匹配 \x{4e00}-\x{9fa5} .

3.时间函数

1.时区

​ 获取时区:date_default_timezone_get()

​ 设置时区:date_default_timezone_set()

默认时区为UTC时区,世界标准时间(英国 格林威治时间)

中国时区为参数 PRC

2.Unix时间戳 time()

time( ) 获取的时间为自1970年一月一日开始到现在的秒数

3.时间戳格式化 date()

date(格式,时间戳)

格式:(严格区分大小写)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 	Y  	4位年份
// y 2位年份
// M 英文月份
// m 数字月份
// w 中文周几
// W 中文第几周
// D 英文周几
// d 天
// H 24小时
// h 12小时 配合a
// i 分钟
// s 秒数
// z 第几天


格式中除了字母外,其他字符都是原样输出

4.创建固定时间点 mktime()

mktime(时,分,秒,月,日,年)

创建的时间点格式也是Unix时间戳

5.英文时间命令 strtotime()

strtotime()

格式:

1
2
3
4
5
6
7
8
//now			此刻时间
//yesterday 昨天
//tomorrow 明天
//last year 上一年
//-2 day 前两天
//2 year 两年后


时间上限:2037-12-31 23:59:59

6.延迟 sleep()

sleep(秒数)

7.微秒 microtime()

microtime() 将时间戳微秒数显示出来

​ 参数:false(默认)微秒数在前,较精确

​ true 将微秒数置后,方便参数计算