目录
常用系统函
1)有关输出的函数
2)有关时间的函数
3)有关数学的函数
4)有关函数的函数
错误处理
错误分类
错误代号
错误触发
错误显示设置
错误日志设置
自定义错误处理
字符串类型
字符串定义语法
字符串转义
字符串长度问题
字符串相关函数
数组
数组的概念
数组定义语法
PHP数组特点
多维数组
二维数组
多维数组
异形数组(不规则数组)
数组遍历
遍历的基本含义
Foreach遍历语法
Foreach遍历原理
数组遍历
For循环遍历数组
While配合each和list遍历数组
常用系统函
1)有关输出的函数
print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号
print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
2)有关时间的函数
date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前时间戳
time():获取当前时间对应的时间戳
microtime():获取微秒级别的时间
前面0.68594500是毫秒数
Strtotime():按照规定格式的字符串转换成时间戳
3)有关数学的函数
max():指定参数中最大的值
min():比较两个数中较小的值
rand():得到一个随机数,指定区间的随机整数
mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用)
round():四舍五入
ceil():向上取整
floor():向下取整
pow():求指定数字的指定指数次结果:pow(2,8) == 2^8 == 256
abs():绝对值
sqrt():求平方根
4)有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
func_get_arg():在自定义函数中去获取指定数值对应的参数
func_get_args():在自定义函数中获取所有的参数(数组)
func_num_args():获取当前自定义函数的参数数量
test有两个形参,但是实参有四个,实参大于形参的个数没事,但是实参小于形参的个数会报错。
附上代码:
常用系统函 1)有关输出的函数 print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号 print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多) 2)有关时间的函数 date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前时间戳 time():获取当前时间对应的时间戳 microtime():获取微秒级别的时间 Strtotime():按照规定格式的字符串转换成时间戳 3)有关数学的函数 max():指定参数中最大的值 min():比较两个数中较小的值 rand():得到一个随机数,指定区间的随机整数 mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用) round():四舍五入 ceil():向上取整 floor():向下取整 pow():求指定数字的指定指数次结果:pow(2,8) == 2^8 == 256 abs():绝对值 sqrt():求平方根 4)有关函数的函数 function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高) func_get_arg():在自定义函数中去获取指定数值对应的参数 func_get_args():在自定义函数中获取所有的参数(数组) func_num_args():获取当前自定义函数的参数数量 错误处理 错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。 错误分类 1)语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行(Parse error) 2)运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error) 3)逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果 $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(错误提示): 可以通过第二个参数进行严格性控制 错误显示设置 错误显示设置:哪些错误该显示,以及该如何显示 在PHP中,其实有两种方式来设置当前脚本的错误处理 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配置项 1、 开启日志功能 2、指定路径 自定义错误处理 最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错 PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。 1、 如何将用户自定义的函数放到系统中?set_error_handler() 2、 自定义错误处理函数,系统有要求 代码实现: 1、 自定义错误处理函数:注意参数 2、 注册自定义函数:修改错误处理机制 当前属于简单自定义模式,如果要复杂,可以在某些影响代码功能的错误发生后,让用户跳转到某个指定界面。 字符串类型 字符串定义语法 1)单引号字符串:使用单引号包裹 2)双引号字符串:使用双引号包裹 引号方式:比较适合定义那些比较短(不超过一行)或者没有结构要求的字符串 如果有结构要求,或者内容超过一行,可以使用以下两种结构定义 3)nowdoc字符串:没有单引号的单引号字符串 $str = <<<’边界符’ 字符串内容 边界符; 4)heredoc字符串:没哟双引号的双引号字符串 $str = <<<边界符 字符串内容 边界符; Heredoc和nowdoc比引号还是要区别多一点 字符串转义 转义的含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理:通常这种方式都是使用反斜杠+字母(单词)的特性: \r\n:回车换行 PHP在识别转义字符的时候也是使用同样的模式:反斜杠+字母 在PHP中系统常用的转义符号: \’:在单引号字符串中显示单引号 \”:在双引号字符串中显示双引号 \r:代表回车(理论上是回到当前行的首位置) \n:代表新一行 \t:类似tab键,输出4个空格 \$:在PHP中使用$符号作为变量符号,因此需要特定识别 单引号和双引号的区别: 1、 其中单引号中能够识别\’,而双引号中就不能识别\’(下图浏览器查看的是页面源代码) 2、 双引号中因为能够识别$符号,所以双引号中可以解析变量,而单引号不可以 双引号中变量识别的规则 1)变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分 2)使用变量专业标识符(区分),给变量加上一组大括号{} 结构化定义字符串变量的规则: 1、 结构化定义字符串对应的边界符有条件: 1.1 上边界符后面不能跟任何内容; 1.2 下边界符必须顶格:最左边; 1.3 下边界同样后面只能跟分号,不能跟任何内容; 2、 结构化定义字符串的内部(边界符之间)的所有内容都是字符串本身 字符串长度问题 1)基本函数strlen():得到字符串的长度(字节为单位) 2)多字节字符串的长度问题:包含中文的长度 3)多字节字符串扩展模块:mbstring扩展(mb:Multi Bytes) 首先需要加载PHP的mbstring扩展 可以使用mb扩展带来很多函数 Mbstring扩展针对的是一些关于字符统计:strlen只是针对标准交换码ASCII,mtstring会针对不同的字符集 字符串相关函数 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,数据的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据。 数组定义语法 在PHP中系统提供多种定义数组的方式: 1、 使用array关键字:最常用的 $变量 = array(元素1,元素2,元素3..); 2、 可以使用中括号来包裹数据: $变量 = [元素1,元素2…]; 3、 隐形定义数组:给变量增加一个中括号,系统自动变成数组 $变量[] = 值1; //如果不提供下标也可以,系统自动生成(数字:从0开始) $变量[下标] = 值; //中括号里面的内容称之为下标key,该下标可以是字母(单词)或者数字,与变量命名的规则相似 PHP数组特点 1) 可以整数下标或者字符串下标 如果数组下标都为整数:索引数组 如果数组下标都为字符串:关联数组 2) 不同下标可以混合存在:混合数组 3) 数组元素的顺序以放入顺序为准,跟下标无关 4) 数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始 5) 特殊值下标的自动转换 布尔值:true和false 空:NULL 6) PHP中数组元素没有类型限制 7) 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($数组变量 as [$下标 =>] $值){ //通过$下标访问元素的下标;通过$值访问元素的值 } 通常:如果是关联数组(字母下标),就需要下标,如果是数字下标就直接访问值 获取下标 在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常是只需要针对一维进行遍历,取得二维数组元素,然后二维数组元素通过下标去访问。 Foreach遍历原理 Foreach遍历的原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针。 Foreach($arr as $k => $v){ //循环体 } 1、 foreach会重置指针:让指针指向第一个元素; 2、 进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量$k中(如果存在),将值取出来放到对应的值变量$v中;(指针下移) 3、 进入到循环内部(循环体),开始执行; 4、 重复2和3,直到在2的时候遇到指针取不到内容(指针指向数组最后) 数组遍历 For循环遍历数组 For循环:基于已知边界条件(起始和结束)然后有条件的变化(规律) 因此:for循环遍历数组有对应条件 1、 获取数组长度:count(数组)得到数组元素的长度 2、 要求数组元素的下标是规律的数字 While配合each和list遍历数组 While是在外部定义边界条件,如果要实现可以和for循环一样。 Each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回: 0下标 – 》 取得元素的下标值 1下标 - 》 取得元素的值 Key下标 – 》取得元素的下标值 Value下标 – 》取得元素的值 如果each取不到结果(数组指针移动到最后),返回false List函数使用:list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中(批量为变量赋值:值来源于数组):list必须从索引数组中去获取数据,而且必须从0开始。 正确操作: 错误操作:变量多于数组元素,没有指定从0到指定变量的下标的数组元素。因为$second变量对应的下标是1,但是数组中没有下标是1 List与each配合特别好:each一定有两个元素就是0和1下标元素 List(变量1,变量2) = each(数组); //是一种赋值运算,但是可以得到false结果(each取不到正确的结果),整个表达式为false
错误处理
错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。
错误分类
1)语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行(Parse error)
2)运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)
3)逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
$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(错误提示):
可以通过第二个参数进行严格性控制
错误显示设置
错误显示设置:哪些错误该显示,以及该如何显示
在PHP中,其实有两种方式来设置当前脚本的错误处理
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配置项
1、 开启日志功能
2、指定路径
自定义错误处理
最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错
PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。
1、 如何将用户自定义的函数放到系统中?set_error_handler()
2、 自定义错误处理函数,系统有要求
代码实现:
1、 自定义错误处理函数:注意参数
header('Content-type:text/html;charset=utf-8');//去除中文乱码
2、 注册自定义函数:修改错误处理机制
当前属于简单自定义模式,如果要复杂,可以在某些影响代码功能的错误发生后,让用户跳转到某个指定界面。
'; echo 'error info :' . $errstr; break; case E_WARNING: case E_USER_WARNING: echo 'Warning in file ' . $errfile . ' on line ' . $errline . '
'; echo 'error info :' . $errstr; break; case E_NOTICE: case E_USER_NOTICE: echo 'Notice in file ' . $errfile . ' on line ' . $errline . '
'; echo 'error info :' . $errstr; break; } return true; } //报错 echo $a; //修改错误机制 set_error_handler('my_error'); echo $a;字符串类型
字符串定义语法
1)单引号字符串:使用单引号包裹
2)双引号字符串:使用双引号包裹
引号方式:比较适合定义那些比较短(不超过一行)或者没有结构要求的字符串
如果有结构要求,或者内容超过一行,可以使用以下两种结构定义
3)nowdoc字符串:没有单引号的单引号字符串
$str = <<<’边界符’
字符串内容
边界符;
4)heredoc字符串:没哟双引号的双引号字符串
$str = <<<边界符
字符串内容
边界符;
Heredoc和nowdoc比引号还是要区别多一点
字符串转义
转义的含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理:通常这种方式都是使用反斜杠+字母(单词)的特性:
\r\n:回车换行
PHP在识别转义字符的时候也是使用同样的模式:反斜杠+字母
在PHP中系统常用的转义符号:
\’:在单引号字符串中显示单引号
\”:在双引号字符串中显示双引号
\r:代表回车(理论上是回到当前行的首位置)
\n:代表新一行
\t:类似tab键,输出4个空格
\$:在PHP中使用$符号作为变量符号,因此需要特定识别
单引号和双引号的区别:
1、 其中单引号中能够识别\’,而双引号中就不能识别\’(下图浏览器查看的是页面源代码)
2、 双引号中因为能够识别$符号,所以双引号中可以解析变量,而单引号不可以
双引号中变量识别的规则
1)变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分
2)使用变量专业标识符(区分),给变量加上一组大括号{}
结构化定义字符串变量的规则:
1、 结构化定义字符串对应的边界符有条件:
1.1 上边界符后面不能跟任何内容;
1.2 下边界符必须顶格:最左边;
1.3 下边界同样后面只能跟分号,不能跟任何内容;
2、 结构化定义字符串的内部(边界符之间)的所有内容都是字符串本身
',$str2; $a = 'hello'; //变量识别 $str1 = 'abce $a dfg'; $str2 = "abce $a dfg"; $str3 = "abce$adfg"; $str4 = "abce{$a}dfg"; echo $str1,'
',$str2,'
',$str3,'
',$str4; $str1 = <<alert('$str1'); //js弹出字符串必须要有引号 EOD; echo $str1;
字符串长度问题
1)基本函数strlen():得到字符串的长度(字节为单位)
2)多字节字符串的长度问题:包含中文的长度
3)多字节字符串扩展模块:mbstring扩展(mb:Multi Bytes)
首先需要加载PHP的mbstring扩展
可以使用mb扩展带来很多函数
Mbstring扩展针对的是一些关于字符统计:strlen只是针对标准交换码ASCII,mtstring会针对不同的字符集
',strlen($str2); echo '
'; //使用mbstring扩展 echo mb_strlen($str1),'
',mb_strlen($str2),'
',mb_strlen($str2,'utf-8');
字符串相关函数
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():随机打乱字符串
附上代码:
'; //echo ucfirst($str); //字符串截取 //echo substr($str,1,3),'
'; //echo strstr($str,'c'); //var_dump(trim($str)); $str = '123a234a3b2a'; $age = 50; $name = 'TOM'; //格式化输出 //echo sprintf("你好,今年我%d岁,我叫%s",$age,$name); //字符串替换 //echo str_replace('a','b',$str); //查找位置 //echo strpos($str,'a'),'
'; //echo strrpos($str,'a'); //其他字符串函数 $str = 'abcdefg'; echo str_repeat($str,5),'
'; echo str_shuffle($str);
数组
数组的概念
数组:array,数据的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据。
数组定义语法
在PHP中系统提供多种定义数组的方式:
1、 使用array关键字:最常用的
$变量 = array(元素1,元素2,元素3..);
2、 可以使用中括号来包裹数据:
$变量 = [元素1,元素2…];
3、 隐形定义数组:给变量增加一个中括号,系统自动变成数组
$变量[] = 值1; //如果不提供下标也可以,系统自动生成(数字:从0开始)
$变量[下标] = 值; //中括号里面的内容称之为下标key,该下标可以是字母(单词)或者数字,与变量命名的规则相似
PHP数组特点
1) 可以整数下标或者字符串下标
如果数组下标都为整数:索引数组
如果数组下标都为字符串:关联数组
2) 不同下标可以混合存在:混合数组
3) 数组元素的顺序以放入顺序为准,跟下标无关
4) 数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始
5) 特殊值下标的自动转换
布尔值:true和false
空:NULL
6) PHP中数组元素没有类型限制
7) PHP中数组元素没有长度限制
补充:PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存。
多维数组
多维数组:数组里面的元素又是数组
二维数组
二维数组:数组中所有的元素都是一维数组
'Jim','age' => 30), array('name' => 'Tom','age' => 28), array('name' => 'Lily','age' => 20) //最后一个元素,后面可以跟逗号不影响(不建议) ); echo '
'; print_r($info);
多维数组
在第二维的数组元素中可以继续是数组,在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($数组变量 as [$下标 =>] $值){
//通过$下标访问元素的下标;通过$值访问元素的值
}
通常:如果是关联数组(字母下标),就需要下标,如果是数字下标就直接访问值
获取下标
在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常是只需要针对一维进行遍历,取得二维数组元素,然后二维数组元素通过下标去访问。
'; } //foreach循环 foreach($arr as $k => $v){ //$v随意命名 //echo 'key:',$k,' == value:',$v,'
'; } $arr = array( 0 => array('name' => 'Tom','age' => 30), 1 => array('name' => 'Jim','age' => 28) ); //通过foreach遍历一维元素 foreach($arr as $value){ //1、可以继续遍历:增加foreach遍历$value //2、可以使用下标访问 echo 'name is : ' ,$value['name'],' and age is : ',$value['age'],'
'; }
Foreach遍历原理
Foreach遍历的原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针。
Foreach($arr as $k => $v){
//循环体
}
1、 foreach会重置指针:让指针指向第一个元素;
2、 进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量$k中(如果存在),将值取出来放到对应的值变量$v中;(指针下移)
3、 进入到循环内部(循环体),开始执行;
4、 重复2和3,直到在2的时候遇到指针取不到内容(指针指向数组最后)
数组遍历
For循环遍历数组
For循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)
因此:for循环遍历数组有对应条件
1、 获取数组长度:count(数组)得到数组元素的长度
2、 要求数组元素的下标是规律的数字
'; }
While配合each和list遍历数组
While是在外部定义边界条件,如果要实现可以和for循环一样。
Each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回:
0下标 - > 取得元素的下标值
1下标 -> 取得元素的值
Key下标 -> 取得元素的下标值
Value下标 -> 取得元素的值
如果each取不到结果(数组指针移动到最后),返回false
List函数使用:list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中(批量为变量赋值:值来源于数组):list必须从索引数组中去获取数据,而且必须从0开始。
正确操作:
错误操作:变量多于数组元素,没有指定从0到指定变量的下标的数组元素。因为$second变量对应的下标是1,但是数组中没有下标是1
List与each配合特别好:each一定有两个元素就是0和1下标元素
List(变量1,变量2) = each(数组); //是一种赋值运算,但是可以得到false结果(each取不到正确的结果),整个表达式为false
'Tom',3,'age' => 30); echo '
'; //each函数指针操作 //print_r(each($arr)); //print_r(each($arr)); //print_r(each($arr)); //print_r(each($arr)); //var_dump(each($arr)); //list结构 $arr = array(1,2 => 1); list($first) = $arr; //list($first,$second) = $arr; //错误:second变量对应的下标为元素下标1的,但是数组没有 //var_dump($first,$second); //while循环 $arr = array(1,'name' => 'Tom',3,'age' => 30); while(list($key,$value) = each($arr)){ //list搭配each //list($key,$value) = each($arr); //输出 echo 'key is :' . $key . ' value is :' . $value . '
'; }翻译一下:不推荐使用each()函数。 此消息将在以后不再显示
原因:php7.2以上废除了each()方法,项目中用到的地方会出现以下报错
The each() function is deprecated. This message will be suppressed on further calls