PHP学习(5)

- 有关数学的函数

max():指定参数中的最大值2

min():比较两个数中最小的值

rand():得到一个随机数,指定区间的随机整数

mt_rand():与rand一样,只是底层结构不一样,效率更高(建议使用)

round():四舍五入

cell():向上取整【eg.1.1取2】

floor():向下取整

pow():求指定数字的指定指数次结果:pow(2,8)== 2^8

abs():绝对值

sqrt():求平方根

- 有关函数的函数

function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)

func_get_arg():在自定义函数中去获取指定数值对应的参数

func_get_args():在自定义函数中获取所有参数(数组)

fun_num_args():获取当前自定义函数的参数数量

- 错误处理

错误处理:指的是系统(用户)在对某些代码执行的时候,发现有错误,就会通过错误处理的形式告知程序员

错误分类:

(1).语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译的过程中不通过,所以代码不会执行(Parse error)

(2).运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)

(3).逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但得不到想要的结果

错误代号:

所有看到的错误代码在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:多字节)

首先需要加载PHP的mbstring扩展

 可以使用mbstring带来很多扩展

mbstring扩展针对一些字符统计,会针对不同字符集;strlen只针对标准交换码ASCII; 

  - 字符串相关函数

(1).转换函数:

implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串

explode(分割字符,目标字符串):将字符串按照某个格式分割,变成数组

中国|北京|顺义 === array('中国','北京','顺义')

str_split(字符串,字符长度):按照指定长度拆分字符串得到数组

(2).截取函数:

trim(字符串,[指定字符]):本身默认是用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容,直到碰到不是目标字符为止 

ltrim():去除左边的

rtrim():去除右边的

(3).截取函数:

substr(字符串,起始位置从0开始,[长度]):指定位置开始截取字符串可以指定截取长度(不指定就截到最后)

strstr(字符串,匹配字符):从指定位置开始截取到最后【可用来取文件后缀名】

(4).大小写转换函数:

strtolower():全部小写

strtouper():全部大写

ucfirst():首字母大写【空格的大写还是空格】

(5).查找函数:

strpos():判断字符在目标字符串中出现的位置(首次)

strrpos():最后出现的位置

 (6).替换函数:

str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中部分字符串进行替换

 (7).格式化函数:

printf / sprintf(输出字符串有占位符,顺序占位内容):格式化输出数据

 (8).其他:

str_repeat():重复某个字符串N次

str_shuffle():随机打乱字符串

  - 数组的概念 

数组:array,数据的组合,将一组数据(多个)存储到一个指定容器,用变量指向该容器,然后通过变量一次性得到该容器的所有数据

数组定义语法:

在PHP中系统提供多种定义数组的方式:

1.使用array关键字:最常用

        $变量 = array(变量1,变量2,变量3);

 2.可以使用中括号包裹数据

        $变量 = [变量1,变量2];

 3.隐形定义数组:给变量加一个中括号,系统自动变成数组

        $变量[] = 值;        //如果比提供下标,系统自动生成(数字:从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($arr as $k => $v){

        //循环体

}

1.foreach会重置指针,让指针指向第一个元素

2.进入foreach循环,通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量中(如果存在),将值取出放到对应的值变量(指针下移)

3.进入循环内部(循环体)开始执行

4.重复2和3,直到2中指针取不到内容(指针指向数组最后)

for循环遍历数组

for循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)【表达式1=>表达式2=>循环体=>表达式3=>表达式2...】

因此:for循环遍历数组有对应的条件

1.获取数组长度:count(数组)得到数组元素长度

2.要求数组元素的下标是规律的数字

【红线标出的是一步优化:不用每次运行都调用一下count函数了】

while配合each和list遍历数组 :

while是在外部定义边界条件,要实现的话可以和for循环一样

each函数的使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回

0下标 => 取得元素的下标值

1下标 => 取得元素的值

key下标 => 取得元素的下标值

value下标 => 取得元素的值

【蓝色的线代表指针下移了】 

如果each取不到结果(数组指针移动到最后),返回false

list函数的使用:list是一种结构,不是一种函数(没有返回值) ,是list提供一堆变量去从一个数组中取得元素值,然后依次存放到变量中(批量为变量赋值,值来源于数组):list必须从索引数组中获取数据,而且必须从0开始

正确操作:

 错误操作:变量多于数组元素,没有指定从0到指定变量的下标的数组元素【second变量对应的下标为元素下标1的,但是数组没有】

 

因此,list和each配合使用:each一定有两个元素0和1下标元素

list(变量1,变量2) = each(数组);        //是一种赋值运算,但是可以得到false结果(each取不到正确的结果),整个表达式为false

 

  - 数组相关的函数

(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():往数组中加入一个元素(数组前面)

PHP模拟数据结构:

栈:压栈,先进去后出来(FILO)

队列:排队,先进去的先出去(FIFO)

          array_reverse():数组元素反过来

         in_array():判断一个元素在数组中是否存在

         array_keys():获取一个数组中所有下标,返回一个索引数组

        array-values():获取一个数组中所有值,返回一个索引数组

  - 编程思想 

编程思想:如何利用数学模式,来解决对应的需求问题,然后利用代码实现对应的数据模型(逻辑)

算法:使用代码实现对应的数学模型,从而解决对应的业务问题

递推算法:

递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论直至得到结果的算法,分为顺推和逆推两种

顺推:通过最简单的条件(已知),然后逐步推演结果

逆推:通过结果找到规律,然后推到已知条件

eg.斐波那契数列:1,1,2,3,5,8,13...,通常需求:求指定位置N所对应的值

找规律:

1.第一个数是1

2.第二个数也是1

3.从第三位开始,属于前两个数的和

代码解决思路:

1.如果数字位置为1和2,对应的值都是1

2.从第三位开始,想办法得到前两个的结果和,就可以得到

解决办法:想办法把要求的位置之前的所有值都列出来,那么要求的数就可以通过前两个之和求出来,使用数组存储所有数据即可

递推函数求斐波那契数列:

 

递归算法:

递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(过程)来表示问题的解

1.简化问题:找到最优子问题(不能再小了)

2.函数自己调用自己

eg.斐波那契数列:1,1,2,3,5,8,13...,通常需求:求指定位置N所对应的值

规律同上:

F(N) = F(N-1)+F(N-2)

F(N-1) = F(N-2)+F(N-3)

...

F(2) = F(1)=1

递归思想中有两个非常重要的点:

递归点:

F(N) = F(N-1)+F(N-2)

递归出口:但问题解决的时候,已经到达(必须有)最优子问题,不能再次调用函数

如果一个函数调用自己而没有递归出口,就是死循环

递归的本质是函数调用函数:一个函数需要开辟一块内存空间,递归会出现同时调用N多个函数(自己):递归的本质利用空间换时间

  - 数组排序算法

冒泡排序:

 

选择排序: 

 

插入排序: 

 

 

快速排序:

 

 

归并排序: 

 

 

 查找算法 :

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值