目录
>代码标记
PHP代码常嵌入HTML内容中,需要有特定的标记来标识。 ↓ 为最常用的标准标记
<?php
···(PHP代码)
?>
扩展:四种标记形式(推荐只用标准标记)
1. 标准式 <?php ?> //推荐使用
2. 短风格 <? ?>
<?= ?>
3. asp风格 <% %>
4. 脚本风格 <script language="php"></script> //不使用,容易跟前端冲突
// <? ?> 需修改php.in文件 short_open_tag = On
// <% %> 需修改php.in文件 asp_tags = On
> 语句及注释
1. 单行注释 // #
2. 多行注释 /* */
3. 多行文档性注释 /** */
用户定义的类和函数、内置的结构以及关键字(如echo、while、class等)是不区分大小写的,而变量是区分大小写的。
> 语句分隔符
在PHP中,代码以行为单位,系统一般通过 ; 判断行的结束
- PHP中标记结束符 ?> 有自带语句结束符的效果,最后一行代码可以没有语句结束符
- PHP中其实很多代码书写并不是嵌入到HTML中,而是单独存在,通常书写习惯中不建议使用标记结束符 ?> ,PHP会自动从开始到最后全部认为是PHP代码,从而解析
> 变量
//定义变量,由符号$与变量名组成,在PHP中不需要任何关键字定义变量(赋值)
$var1; //定义变量
$var2 = 1; //定义同时赋值
//访问变量
echo $var2;
//修改变量
$var2 = 2;
//删除变量,使用unset(变量名)
unset($var2);
> 变量命名规范
- 在PHP中变量名字必须以 " $ " 符号开始
- 名字由字母、数字和下划线" _ "构成,但是不能以数字开头
- 在PHP中本身还允许中文变量(但不推荐,容易引起编码错误)
> 预定义变量
> 可变变量
如果一个变量保存的值刚好是另一个变量的名字,那么可以直接通过访问这个变量得到另一个变量的值,PHP的可变变量可由符号$与普通变量组成。
> 变量传值
- 值传递:将变量保存的值复制一份,然后将新的值给另一个变量保存(两个变量没有关系)
- 引用传递:将变量保存的值所在的内存地址,传递给另一个变量,两个变量指向同一块内存空间(两个变量是同一个值)
//传值赋值:使用赋值运行符=直接将数据或表达式的值赋给另一个变量 $x1 = 3.14; $x2 = $x1; //引用赋值:在赋值运算符=右边的变量前加上一个&符号,让新变量指向原变量 $x3 = &$x1; $x1 = 3.1415; //此后$x3的值会变成3.1415
需要注意的是,PHP的引用并不像C语言中的地址指针,通过引用赋值定义的变量与原变量并不表示同一个内存单元,而仅仅是其值相互关联而已。所以,若对原变量使用销毁(unset)操作,不会导致引用变量的消失
$x1 = 3.14; $x3 = &$x1; unset($x1); //销毁变量x1 var_dump($x3); //仍然会正常输出变量x3的值
> 常量
常量:const/constant,是一种在程序运行当中,不可改变的量(数据)
常量一旦定义,通常数据不可改变(用户级别)
> 常量定义形式
在PHP中常量有两种定义方式
1)使用define( ) 函数
function define($name,$value,$case_insentive=null)
参数:1.常量名称 2.常量的值或表达式 3.是否区分大小写(默认为false,即区分)
2)使用const关键字 (5.3之后才有的)
const 常量名 = 常量值
使用const关键字,声明语句必须处于最上层的作用域内。
即不能使用该方法在函数、循环以及if语句内定义常量。define( ) 和 const 定义的常量是有区别的:访问权限区别
> 常量命名规范
- 常量的名字由字母、数字和下划线组成,不能以数字开头
- 常量的名字通常是大写字母为主(与变量以示区别)
- 常量名可以不加引号,但是通常加上引号
- 常量命名规则比变量要松散,可以使用一些特殊字符,该方式只能使用define定义
> 常量使用形式
有的时候还需要使用另一种形式来访问(针对的是特殊名字的常量)
constant('变量名')
> 系统常量
系统帮助用户定义的常量,用户可以直接使用
常用的几个系统常量:
1. PHP_VERSION : PHP版本号
2. PHP_INT_SIZE : 整形大小
3. PHP_INT_MAX : 整形能表示的最大值(PHP中整形是允许出现负数,带符号)
在PHP中还有一些特殊的常量 : 系统魔术常量,格式:__+常量名+__
魔术常量的值通常会跟着环境变化,但是用户改变不了
> 数据类型
在PHP中将数据分为三大类八小类
简单(基本)数据类型:4个小类
- 整型:int/integer,系统分配4个字节存储,表示整数类型(有前提)
- 浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
- 字符串型:string,系统根据实际长度分配,表示字符串(引号)。
- 布尔类型:bool/boolean,表示布尔类型,只有两个值:true和false
复合数据类型:2个小类
- 对象类型:object,存放对象(面向对象)
- 数组类型:array,存储多个数据(一次性)
特殊数据类型:2个小类
- 资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
- 空类型:NULL,只有一个值就是NULL(不能运算)
PHP中的变量在以下三种情况下均被认为是NULL类型:
- 被赋值为NULL
- 没有被赋值
- 使用unset进行类型转换后的返回值
> 类型判断
通过一组类型判断函数,来判断变量,最终返回这个变量所保存数据的数据类型(相同结果为true,失败为false),是一组以 is_ 开头后面跟类型名字的函数 : is XXX(变量名)
> 强制类型转换
- 使用函数setType() function srttype(& $var,$type)
- 使用类型转换函数intval()、floatval()、strval()
- 使用强制类型转换运算符
注意:
- (string)(int)(float)(array)(object)(bool)(unset) null、resource不能转化
- 对变量使用函数setType()后,变量本身的数据类型发生了变化,而使用以val结尾的函数,只是得到了新类型的数据,变量本身的类型不变
> 类型转换 - 字符串转数值
- 以字母开头的字符串,永远为0
- 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
> 获取及设定数据(变量)的类型
var_dump(变量名): 得到变量的类型和值
gettype(变量名):获取类型,得到的是该类型对应的字符串
setttype(变量名,类型):设定数据类型,与强制转换不同
- 强制转换(类型)变量名,是对数据值复制的内容进行处理(不会处理实际存储的内容)
- settype会直接改变数据本身
> 整型
可由二进制、八进制、十进制和十六进制来表示
> 浮点数
> 布尔型
true 和 false 是PHP的内部关键字,没有大小写之分
在进行某些数据判断的时候,需要特别注意类型转换 (更多具体可看附录-PHP类型比较表)
- empty():判断数据的值是否为"空",不是NULL,空则返回true
- isset():判断数据存储的变量本身是否存在,存在则返回true
>运算符
>算术运算符
> 比较运算符(只补充,基础略过)
- === :全等于,左边与右边相同:大小以及数据的类型都要相同
- !== :不全等于,只有大小或者类型不同
> 逻辑运算符
浅看两道面试题
$a =10;
$b = 5;
if($a = 8 || $b = 7){
$b++;
}
echo $a;//1
echo "<br/>";
echo $b;//6
$a =10;
$b = 5;
if($a = 8 && $b = 7){
$b++;
}
echo $a;//1
echo "<br/>";
echo $b;//8
> 连接运算符
连接运算:是PHP中将多个字符串拼接的一种符号
- . :将两个字符串接到一起
- .= :复合运算,将左右内容连接后重新赋值给左边的变量 A.=b -> A=A.b
> 错误抑制符
在可能出错的表达式前面使用@符号即可
错误抑制符通常在生产环境(上线)会用到,在开发的时候不会用
> 类型运算符
instanceof用于判断一个对象是不是某个类的对象
class A{}
$obj = new A();
$r1 = $obj instanceof A;
> 执行运算符
使用反引号(`),尝试将反引号中的字符串内容作为操作系统的系统命令来执行,并返回该系统命令的执行结果
$cmd = `cmd`;
echo $cmd;
> 流程控制
>流程控制替代语法
> foreach 循环
foreach是针对数据集合的循环,比如数组、列表等
foreach($arr as $value) 语句
foreach($arr as $key => $value) 语句
foreach ($arr as $value)
$sum += $value;
> 文件包含
在一个PHP脚本中,去将另外一个文件(PHP)包含进来,去合作完成一件事情。
> 文件包含四种形式
- include:包含文件
- include_once:系统会自动判断文件包含过程中,是否已经包含过
- require:与include相同
- require_once:以include_once相同
include和include_once的区别:
- include系统会碰到一次,执行一次;多次加载,会执行多次;
- include_once:系统碰到多次,也只会执行一次。
require和include的区别:(唯一的区别在于包含不到文件的时候,报错的形式不一样)
- include:发出警告信息,程序继续运行
- require:发出致命错误,程序停止运行
> 文件包含基本语法
include ‘文件名字’;
include(‘文件名字’); //文件名字:路径问题
>向上包含和向下包含
- 向上包含:先包含文件,后使用文件中的内容
- 向下包含:先准备内容,然后包含另外的文件,在另外的文件中使用当前内容
> 文件加载路径
- 绝对路径
- 相对路径
绝对路径和相对路径的加载区别:
- 绝对路径相对效率偏低,但是相对安全(路径不会出问题)
- 相对路径相对效率高些,但是容易出错(相对路径会发生改变)
> 文件嵌套包含
文件嵌套包含:一个文件包含另外一个文件,同时被包含的文件又包含了另外一个文件。
嵌套包含的时候就很容易出现相对路径出错的问题:相对路径会因为文件的包含而改变(./和../):windows下面,每一个文件夹下都有.和..的文件夹。
> 函数
> 函数的定义
函数有几个对应的关键点:function关键字、函数名、参数(形参和实参)、函数体和返回值
function 函数名(含类型说明的形参表):类型说明符
{
//函数体
//返回值:return 结果;
}
> 函数调用特点
> 函数命名规范
- 函数名不区分大小写
- 由字母、数字和下划线组成,但是不能以数字开头
- 在一个脚本周期中,不允许出现同名函数
> 默认值
> 引用传递
Function 函数名(形参1,&形参2){
//函数体
}
> 函数返回值
返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处):在PHP中所有的函数都有返回值。(如果没有明确return使用,那么系统默认返回NULL)
return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置。(通常在系统配置文件中使用较多)
> 全局变量与局部变量
默认情况下,全局变量在内部函数中是不可访问的。为了让一个函数能够访问到全局变量,可以在函数内使用global关键字来声明变量,或者使用PHP的$GLOBALS数组。
> 超全局变量
- 超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等)
- 所属超全局空间:没有访问限制(函数内外都可以访问)、
- 超全局变量会将全局变量自动纳入到$GLOBALS里面,而$GLOBALS没有作用域限制,所以能够帮助局部去访问全局变量:但是必须使用数组方式
> global关键字
global关键字:是一种在函数里面定义变量的一种方式
- 如果使用global定义的变量名在外部存在(全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一个变量);
- 如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量
- 本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有。
基本语法: Global 变量名; //不能赋值 变量名 = 值; //修改
> 静态变量
function 函数名(){
//定义变量
static $变量名 = 值; //通常会在定义的时候就直接赋值
}
-
静态变量的作用是为了跨函数共享数据(同一个函数被多次调用)
-
> 可变函数/变量函数
可变函数:变量的值为函数名,可使用变量+()来充当函数使用。
$变量 = ‘display’;
Function display(){
···
}
$变量(); //可变函数
> 内部函数
所谓内部函数,就是定义在某个函数内部的函数。对内部函数的外部调用,其调用语句与主函数的调用语句之间存在顺序依赖。(必须位于主函数调用语句之后)
function myprint(string $param1,int $param2):void {
function inmyprint() {
echo '这是inmyprint函数的输出!'.'<br/>';
}
echo '这是myprint函数的输出!'.'<br/>';
echo $param1,$param2,'<br/><br/>';
echo '内部调用inmyprint后输出:<br/>';
inmyprint();
return;
}
//inmyprint();
myprint('a = ',10);
inmyprint();
> 回调参数
将函数名作为参数,被作为函数传递的函数名就是回调函数,其实就是在函数内部使用可变函数
> 匿名函数
变量名 = function(){
//函数体
};
变量保存匿名函数,本质得到的是一个对象(Closure)
> 闭包
要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)
简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)
> 伪类型
假类型,实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习。
int string null bool array object float resource //三大类八小类
callback 参数必须是一个函数名
mixed 可接受不同类型
number 接受整型和浮点
void 无参数/无用的返回值
> 常用系统函数の输出
- print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号
- print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
> 常用系统函数の时间
- date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前时间戳
- time():获取当前时间对应的时间戳
- microtime():获取微秒级别的时间
-
strtotime():按照规定格式的字符串转换成时间戳
> 常用系统函数の数学
- max():指定参数中最大的值
- min():比较两个数中较小的值
- rand():得到一个随机数,指定区间的随机整数
- mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用)
- round():四舍五入
- ceil():向上取整
- floor():向下取整
- pow():求指定数字的指定指数次结果:pow(2,8) == 2^8 == 256
- abs():绝对值
- sqrt():求平方根
> 常用系统函数の函数
- function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
- func_get_arg():在自定义函数中去获取指定数值对应的参数
- func_get_args():在自定义函数中获取所有的参数(数组)
- func_num_args():获取当前自定义函数的参数数量
> 错误处理
指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。
> 错误分类
- 语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行(Parse error)
- 运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)
- 逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
$a = 10; if($a = 1){ //最常见把比较符号写成赋值符号 //执行代码 }
>错误代号
所有看到的错误代号在PHP中都被定义成了系统常量(可以直接使用)
1)系统错误:
- E_PARSE:编译错误,代码不会执行
- E_ERROR:fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)
- E_WARNING:warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果
- E_NOTICE:notice,通知错误,不会影响代码执行
2)用户错误:
- E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE
- 用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
3)其他:
- E_ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开发过程中(开发环境)使用使用
所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作
排除通知级别notice:E_ALL & ~E_NOTICE
只要警告和通知:E_WARNING | E_NOTICE
> 错误触发
- 程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,输出给用户:主要针对代码的语法错误和运行时错误
- 人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示 Trigger_error
可以通过第二个参数进行严格性控制
> 错误显示设置
1、PHP的配置文件:全局配置:php.ini文件
Display_errors:是否显示错误
Error_reporting:显示什么级别的错误
2、可以在运行的PHP脚本中去设置:在脚本中定义的配置项级别比配置文件高(通常在开发当中都会在代码中去进行控制和配置)
Error_reporting():设置对应的错误显示级别
Ini_set(‘配置文件中的配置项’,配置值)
Ini_set(‘error_reporting’,E_ALL);
Ini_set(‘display_errors’,1);
> 错误日志设置
在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
1、不友好
2、不安全:错误会暴露网站很多信息(路径、文件名)
所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini_set)设置对应error_log配置项
- 开启日志功能
- 指定路径
> 自定义错误处理
最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错
PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。
- 如何将用户自定义的函数放到系统中?set_error_handler()
- 自定义错误处理函数,系统有要求
代码实现:
- 自定义错误处理函数:注意参数
- 注册自定义函数:修改错误处理机制
> 字符串
> 字符串定义语法
- 单引号字符串:使用单引号包裹
- 双引号字符串:使用双引号包裹
- nowdoc字符串:没有单引号的单引号字符串
$str = <<<'边界符' 字符串内容 边界符;
- heredoc字符串:没有双引号的双引号字符串
$str = <<<边界符 字符串内容 边界符;
引号适合定义那些比较短(不超过一行)或者没有结构要求的字符串
如果有结构要求,或者内容超过一行,使用nowdoc/heredoc字符串
结构化定义字符串变量的规则:
- 上边界符后面不能跟任何内容;
- 下边界符必须顶格:最左边;
- 下边界同样后面只能跟分号,不能跟任何内容;
- 结构化定义字符串的内部(边界符之间)的所有内容都是字符串本身;
> 字符串转义
转义的含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理:通常这种方式都是使用反斜杠+字母(单词)的特性:
\r\n:回车换行
PHP在识别转义字符的时候也是使用同样的模式:反斜杠+字母
在PHP中系统常用的转义符号:
\’:在单引号字符串中显示单引号
\”:在双引号字符串中显示双引号
\r:代表回车(理论上是回到当前行的首位置)
\n:代表新一行
\t:类似tab键,输出4个空格
\$:在PHP中使用$符号作为变量符号,因此需要特定识别
单引号和双引号的区别:
- 其中单引号中能够识别\’,而双引号中就不能识别\’ ;反过来同理
- 双引号中因为能够识别$符号,所以双引号中可以解析变量,而单引号不可以
双引号中变量识别的规则
- 变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分
- 使用变量专业标识符(区分),给变量加上一组大括号{}
> 字符串长度
- 基本函数strlen():得到字符串的长度(字节为单位)
- 多字节字符串的长度问题:包含中文的长度,需用到多字节字符串扩展模块:mbstring扩展(mb:Multi Bytes)
首先需要加载PHP的mbstring扩展(把880行前面的;去掉)可以使用mb扩展带来很多函数
mbstring扩展针对的是一些关于字符统计:strlen只是针对标准交换码ASCII,mbstring会针对不同的字符集
> 字符串相关函数
1)转换函数:implode(), explode(), str_split()
- implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
- explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组 中国|北京|顺义 == array(‘中国’,‘北京’,’顺义’);
- str_split(字符串,字符长度):按照指定长度拆分字符串得到数组
2)截取函数:trim(), ltrim(), rtrim()
- trim(字符串[,指定字符]):本身默认是用来去除字符串两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为止
- ltrim():去除左边的
- rtrim():去除右边的
3)截取函数:substr(), strstr()
- substr(字符串,起始位置从0开始[,长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
- strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来去文件后缀名)
4)大小转换函数:strtolower(), strtoupper(), ucfirst()
- strtolower:全部小写
- strtoupper:全部大写
- ucfirst:首字母大写
5)查找函数:strpos(), strrpos()
- Strpos(字符串,匹配字符):判断字符在目标字符串中出现的位置(首次)
- Strrpos(字符串,匹配字符):判断字符在目标字符串中最后出现的位置
6)替换函数:str_replace()
- str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换
7)格式化函数:printf(), sprintf()
- printf/sprintf(输出字符串有占位符,顺序占位内容..):格式化输出数据
8)其他:str_repeat(), str_shuffle()
- str_repeat():重复某个字符串N次
- str_shuffle():随机打乱字符串
> 数组
数组:array,数据的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据。
> 数组定义语法
- 用array关键字(最常用):$变量 = array(元素1,元素2,元素3..);
- 用中括号来包裹数据:$变量 = [元素1,元素2…];
- 隐形定义数组:给变量增加一个中括号,系统自动变成数组 $变量[] = 值1; //如果不提供下标也可以,系统自动生成(数字:从0开始) $变量[下标] = 值; //中括号内容为下标key,可是字母(单词)或数字,与变量命名规则相似
> 数组特点
- 可以整数下标或者字符串下标。都为整数:索引数组;都为字符串:关联数组
- 不同下标可以混合存在:混合数组
- 数组元素的顺序以放入顺序为准,跟下标无关
- 数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始
- 特殊值下标的自动转换 布尔值:true和false 空:NULL
- PHP中数组元素没有类型限制
- PHP中数组元素没有长度限制
- PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存。
> 二维数组
数组中所有的元素都是一维数组
> 多维数组
多维数组:数组里面的元素又是数组
在第二维的数组元素中可以继续是数组,在PHP中没有维度限制(PHP本质并没有二维数组)
但是:不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率。
> 异性数组(不规则数组)
异形数组:数组中的元素不规则,有普通基本变量也有数组。
在实际开发中,并不常用,尽量让数组元素规则化(便于进行访问)
> 数组遍历
数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。
$arr = array(0=>array(‘name’ => ‘Tom’),1=>array(‘name’ => ‘Jim’)); //二维数组
//访问一维元素:$arr[一维下标]
$arr[0]; //结果:array(‘name’ => ‘Tom’);
//访问二维元素:$arr[一维下标][二维下标]
$arr[1][‘name’]; //Jim
> foreach 遍历
遍历原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针。
1、foreach会重置指针:让指针指向第一个元素;
2、进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量$k中(如果存在),将值取出来放到对应的值变量$v中;(指针下移)
3、进入到循环内部(循环体),开始执行;
4、重复2和3,直到在2的时候遇到指针取不到内容(指针指向数组最后)
Foreach($数组变量 as [$下标k =>] $值v){
//通过$下标访问元素的下标;通过$值访问元素的值
//如果是关联数组(字母下标),就需要下标,如果是数字下标就直接访问值
}
在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常是只需要针对一维进行遍历,取得二维数组元素,然后二维数组元素通过下标去访问。
> for循环遍历数组
for循环遍历数组有对应条件:
- 获取数组长度:count(数组)得到数组元素的长度
- 要求数组元素的下标是规律的数字
> While配合each和list遍历数组
While是在外部定义边界条件,如果要实现可以和for循环一样。
Each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回:
0下标 -> 取得元素的下标值
1下标 -> 取得元素的值
Key下标 -> 取得元素的下标值
Value下标 –> 取得元素的值
如果each取不到结果(数组指针移动到最后),返回false
List函数使用:list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中(批量为变量赋值:值来源于数组):list必须从索引数组中去获取数据,而且必须从0开始。
> 数组的相关函数
1)排序函数:对数组元素进行排序,都是按照ASCII码进行比较,可以进行英文比较
- sort():顺序排序(下标重排)
- rsort():逆序排序
- asort():顺序排序(下标保留)
- arsort():逆序排序
- ksort():顺序排序:按照键名(下标)
- krsort():逆序排序
- shuffle():随机打乱数组元素,数组下标会重排
2)指针函数
- reset():重置指针,将数组指针回到首位
- end():重置指针,将数组指针指到最后一个元素
- next():指针下移,取得下一个元素的值
- prev():指针上移,取得上一个元素的值
- current():获取当前指针对应的元素值
- key():获取当前指针对应的下标值
注意事项:
next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组),导致数组不能使用,通过next和prev不能回到正确的指针位置。只能通过end或者reset进行指针重置。
3)其他函数
- count():统计数组中元素的数量
- array_push():往数组中加入一个元素(数组后面)
- array_pop():从数组中取出一个元素(数组后面)
- array_shift():从数组中取出一个元素(数组前面)
- array_unshift():从数组中加入一个元素(数组前面)
- array_reverse():数组元素反过来
- in_array():判断一个元素在数组中是否存在
- array_keys():获取一个数组的所有下标,返回一个索引数组
- array_values():获取一个数组的所有值,返回一个索引数组
PHP模拟数据结构:
栈:压栈,先进去后出来(FILO)
队列:排队,先进去的先出去(FIFO)