PHP语法(五)
作业
- 猴子吃桃子,第一天吃了一半又多吃一个,第二天一样,到第十天就剩下一个桃子,请问原来有几个桃子?
分析:
用n表示第n天
f(n)/2-1=f(n+1)
f(n)=(f(n+1)+1)*2
代码
- 用递归实在二分法
错误处理
错误分类
- 语法错误
- 运行时错误
- 逻辑错误
总结:语法错误是最容易发现的错误,逻辑错误是最难发现的错误。
错误级别
按照错误的严重程度,将错误划分为如下3种:
- notice:提示
- warning:警告
- error:错误
notice和warning错误后代码继续执行,error错误后代码终止执行。
错误的触发
方式一:PHP程序触发
方式二:用户自己触发(trigger_error())
例题:如果年龄不在20~30之间就报错
用户触发错误级别(参照php.ini文件)
多学一招:错误的级别是PHP预定义常量。每一位的1表示一种错误类型。
错误的处理方式
- 显示错误报告(默认)
- 将错误记录在日志中
- 交给用户自定义脚本进行错误处理
错误处理方式的设置
- 报错错误级别
- 浏览器上显示(关闭)错误报告
- 在日志中记录错误
应用:开发的时候错误显示在浏览器,日志不记录,项目运行的时候错误不显示在浏览器上,错误记录在日志中。
- 自定义脚本处理错误
应用:
/**
*@param $level 错误的类别
*@param $msg 错误的信息
*@param $file 错误的文件
*@param $line 错误的行号
*/
function error($level,$msg,$file,$line) {
switch($level) {
case E_NOTICE:
case E_USER_NOTICE:
echo ‘屏蔽此错误<br>’;
break;
case E_WARNING:
case E_USER_WARNING:
echo ‘将错误记录在日志中<br>’;
break;
case E_ERROR:
case E_USER_ERROR:
echo ‘发邮件<br>’;
break;
}
echo ‘错误信息:’.$msg,'<br>’;
echo ‘错误文件:’.$file,'<br>’;
echo ‘错误行号:’.$line,'<hr>’;
}
set_error_handler(‘error’); //注册错误处理函数
trigger_error(‘自己触发的错误’);
trigger_error(‘警告’,E_USER_WARNING);
trigger_error(‘错误’,E_USER_ERROR);
更改PHP配置
- php.ini文件,所有的虚拟主机全部有效,需要重启服务器
- .htaccess文件,在当前目录及子目录下有效,不需要重启服务器
- ini_set():当前页面中有效,不需要重启服务器
HTTP错误编
1xx(临时响应)
2xx(成功)
3xx(重定向)
4xx(请求错误)
5xx(服务器错误)
需要记忆的编码
- 200 – 成功
- 301-永久移动
- 302-临时移动
- 403-拒绝访问
- 404 – 请求的网页不存在
- 500—服务器内部错误
- 502—网关错误
数组的指针
指针的介绍
- 指针本质是一个变量,保存指向某个元素的地址
- 默认情况下打开一个数组,指针指向数组的第一个元素
- foreach的流程图
操作指针的函数
key():返回当前指针的键
current():返回数组中的当前单元
next():指针下移一位
prev():指针倒回一位
reset():指针初始化
end():指针指向最后一位
通过for循环遍历数组
- 从前往后遍历数组
- 从后往前遍历数组
each()
作用:返回当前的键值并且指针向前移动一位,如果到了数组的末端返回false
each()=current()+key()+next()
each()返回4个元素的数组,既有索引数组又有关联数组,键的下标是0和key,值的下标是1和value。
通过while循环遍历数组
常用的函数
操作数组的函数
- range(起始值,结束值,[步长=1]),生成指定范围的数组
- array_merge():数组合并
- array_rand():数组中随机取出一个或多个单元
- shuffle():打乱数组
- in_array():检查数组中是否存在某个值
- is_array():检测变量是否是数组
- array_keys():返回数组中所有的键名
- array_values():返回数组中所有的值
- explode():将字符串分割成数组
- implode():将一个一维数组的值转化为字符串
- array_diff():数组相减
- array_intersect():数组相交
字符串操作函数
- 字符串可以看成是字符的集合,可以通过[]来访问字符串(不能操作中午)
- strlen():获取字符串长度,以字节为单位
- strpos():查找子字符串在字符串第一次出现的位置
- strrpos():查找子字符串在字符串最后一次出现的位置
- str_repeat():字符串重复
- substr()
- strchr()和strstr()是一样的:从第一次出现的字符串开始截取,一直截取到最后
- strrchr():从最后一次出现的字符串开始截取,一直截取到最后
- str_replace():字符串替换
- str_split():把字符串分割成数组
- strtolower():将字符串转成小写
- strtoupper():将字符串转成大写
- ucfirst():首字母大写
- trim():去字符串两边的空格
- ltrim():去字符串左边的空格
- rtrim():去字符串右边的空格
- nl2br():将\n转成<br>
- htmlentities():实体转换
多字节处理
PHP默认不支持多字节处理,需要在php.ini中开启多字节处理。
mb_扩展都是以字符为单位。
算法
冒泡排序
思想:从第0个和第1个数比较,第1个数和第2个数比较,以此类推,第i和和第i+1个数比较,满足条件就交换。
<?php
$num=array(140,20,52,78,12,45,105,56,23);
/*
//第一次循环
for($i=0;$i<count($num)-1;$i++){
if($num[$i]>$num[$i+1]){
$temp=$num[$i];
$num[$i]=$num[$i+1];
$num[$i+1]=$temp;
}
}
//第二次循环
for($i=0;$i<count($num)-2;$i++){
if($num[$i]>$num[$i+1]){
$temp=$num[$i];
$num[$i]=$num[$i+1];
$num[$i+1]=$temp;
}
}
//第三次循环
for($i=0;$i<count($num)-3;$i++){
if($num[$i]>$num[$i+1]){
$temp=$num[$i];
$num[$i]=$num[$i+1];
$num[$i+1]=$temp;
}
}
print_r($num);
//剩下以此类推
*/
//分析
/**
*初始数据
第一次 20,52,78,12,45,105,56,23,(140)
第二次 20,52,12,45,78,56,23,(105,140)
第三次 20,12,45,52,56,23,(78,105,140)
以此类推
*/
//实现代码
for($n=1;$n<count($num)-1;$n++){ //总共要循环几次
for($i=0;$i<count($num)-$n;$i++){
if($num[$i]>$num[$i+1]){
$temp=$num[$i];
$num[$i]=$num[$i+1];
$num[$i+1]=$temp;
}
}
}
print_r($num);
选择排序
思想:第0个数和其他的数比(确定一个数),第1个数和其他剩余的数(再确定一个数),第2个和其他的数比,以此类推
<?php
$num=array(140,20,52,78,12,45,105,56,23);
/**
*分析:140,20,52,78,12,45,105,56,23
第一次 (12),140,52,78,20,45,105,56,23
第二次 (12,20),140,78,52,45,105,56,23
第三次 (12,20,23),140,78,52,105,56,45
以此类推
//第一次循环
for($i=1;$i<count($num);$i++){
if($num[0]>$num[$i]){
$temp=$num[0];
$num[0]=$num[$i];
$num[$i]=$temp;
}
}
//第二次循环
for($i=2;$i<count($num);$i++){
if($num[1]>$num[$i]){
$temp=$num[1];
$num[1]=$num[$i];
$num[$i]=$temp;
}
}
//第三次循环
for($i=3;$i<count($num);$i++){
if($num[2]>$num[$i]){
$temp=$num[2];
$num[2]=$num[$i];
$num[$i]=$temp;
}
}
//依次类推
print_r($num);
*/
//实现代码
for($n=0;$n<count($num)-1;$n++){ //循环的次数
for($i=$n+1;$i<count($num);$i++){//数据交换
if($num[$n]>$num[$i]){
$temp=$num[$n];
$num[$n]=$num[$i];
$num[$i]=$temp;
}
}
}
print_r($num);
快速排序
思想:以第0个数为标准,比它小的放左边,比它大的放右边
分析:
原始数据
第一次排序,以60为标准,比60小排左边,比60大排右边,这个数组分成了2数组
第二次排序:将分成的两个数组再执行和第一次排序一样的动作
以此类推
实现代码
<?php
$num=array(140,20,52,78,12,45,105,56,23);
function mysort($arr) {
$len=count($arr); //数组的长度
if($len==0 || $len==1)//如果数组为空或就一个数据,直接将数组返回
return $arr;
$temp=$arr[0]; //以第0个数为标准
$small=$big=array(); //声明两个数组
for($i=1;$i<$len;$i++){
if($arr[$i]<$temp)
$small[]=$arr[$i];
else
$big[]=$arr[$i];
}
$small_array=mysort($small); //递归调用
$big_array=mysort($big); //递归调用
return array_merge($small_array,array($temp),$big_array);//数组合并
}
//调用
print_r(mysort($num));