/** PHP函数集合
* 1输出1-10000000以内的所有质数。
* 2展示出一个目录下面所有的文件
* 3统计出一个文件夹下面目录的数量和文件的数量 引用传值
* 4统计出一个文件夹下面目录的数量和文件的数量 累加
* 5删除一个目录及其文件
* 6递归求桃子
*
*/
/**1
* 输出1-10000000以内的所有质数。
* 1. 先将n开平方缩小范围
* 2. 再将所有质数放在数组中
* 3. 分别将要计算的数字去除以小于开平方n的数组中的每一个数字,如果都除不尽,那么这个数字也是质数
*/
$arr[]=2;
$len=1;
for($i=2;1;$i++){
for($m=0,$n=sqrt($i);$m<$len&&$arr[$m]<=$n;$m++){
if($i%$arr[$m]==0){ continue 2;}
}
echo $i,' ';
$arr[]=$i;
$len=count($arr);
}
/**2
* 展示出一个目录下面所有的文件
* @param string $dir 要遍历的目录路径
* @return void
*/
function showAllFiles($dir,$b=''){
if(! file_exists($dir)){e
cho "请输入一个正确路径!";
return false;}
$handle = opendir($dir);// 打开句柄
// 当文件名为0的时候,判断是否全等于false,不全等于false继续执行
while(($fileName = readdir($handle))||($fileName!==false)){
if(($fileName=='.')||($fileName=='..')){
continue;
}
// 过滤.和..
$fileZuhe = "$dir/$fileName";// 拼接完整路径
$fileName = iconv('gbk', 'utf-8', $fileName);
// 将操作系统的gbk转为utf-8
if(is_dir(
$fileZuhe
)){// 如果是一个文件夹,递归
echo $b,$fileName,'<br/>';
showAllFiles(
$fileZuhe
,$b.'--|');
}else{
echo $b,$fileName,'<br/>';
}
}
closedir($handle);// 关闭句柄,释放资源
}
/**3
* 统计出一个文件夹下面目录的数量和文件的数量 引用传值
* @param string $dir 要统计数量的目录
* @return array(文件夹数量,文件数量)
*/
function countDirA($dir,&$dirNum=0,&$fileNum=0){
$handle = opendir($dir);// 打开句柄
// 当文件名为0的时候,判断是否全等于false,不全等于false继续执行
while(($fileName = readdir($handle))||($fileName!==false)){
if($fileName == '.' || $fileName == '..') continue;// 过滤.和..
$fileName
= "$dir/$fileName";// 拼接完整路径
if(is_dir($fileName
)){
$dirNum++;
countDirA($fileName
,$dirNum,$fileNum);
}else{
$fileNum++;
}
}
closedir($handle);// 关闭句柄
return array($dirNum,$fileNum);
}
/**4
* 统计出一个文件夹下面目录的数量和文件的数量 累加
* @param string $dir 要统计数量的目录
* @return array(文件夹数量,文件数量)
*/
function countDirB($dir){
$dirNum = 0;// 定义文件夹数量,文件数量
$fileNum = 0;
$handle = opendir($dir);// 打开句柄
// 当文件名为0的时候,判断是否全等于false,不全等于false继续执行
while(($fileName = readdir($handle))||($fileName!==false)){
if($fileName == '.' || $fileName == '..') continue;// 过滤.和..
$fileName
= "$dir/$fileName";// 拼接完整路径
if(is_dir($fileName
)){
$dirNum++;
$res = countDirB($fileName
);
$dirNum += $res[0];
$fileNum += $res[1];
}else{
$fileNum++;
}
}
closedir($handle);
return array($dirNum,$fileNum);
}
/**5
* 删除一个目录
* @param string $dir 要删除的目录
* @return bool
*/
header("content-type:text/html;charset=utf-8");
//实例:递归删除指定目录及所有文件
function delFile($dirf){
$handle=opendir($dirf);//打开句柄
//循环读取所有文件 ,当文件夹为0,0!==false是true,0文件名可读,括号 不能少:=号赋值优先级最低
while (($fileName=readdir($handle))||$fileName!==false) {//记得是不全等号!==
//!如果目录为“.”和“..”则跳过,这里不要写错,符号或“||”不要弄错,否则很危险 !!!!!!!
//今天就因为把||写成&&,差点将e盘清空,所以一定要慎之又慎!
if($fileName=='.'||$fileName=='..')continue;
$fielzuhe="$dirf/$fileName";
if (is_dir($fielzuhe)) {//如果是目录则递归删除,如果是普通文件,直接删除
delFile($fielzuhe);//递归调用
} else {
unlink($fielzuhe);//删除文件
}
}
closedir($handle);//关闭句柄
return rmdir($dirf);//删除目录
}
/**6递归求桃子
*有一个猴子,偷到一堆桃子,第一天,他吃了桃子数量的一半多一个,第二天,他又吃了桃子剩下的一半又多一个。。。。第二十天,猴子发现还剩1个桃子了,问,这个猴子偷了多少个桃子。(递归算法)
*/
function fn($n){
//递归出口
if($n==1){ return 1;}
return (fn($n-1)+1)*2;
}
echo fn(20);
- function sort($category,$parent_id=0,$level=0){
- static $arr=array();
- foreach($category as $k=>$v){
- if($v['parent_id']==$parent_id){
- $v['level']=$level;
- $arr[]=$v;
- unset($category[$k]);//已经排好等级的,从数组中移除,提高性能
- $this->sort($category,$v['id'],$level+1);
- }
- }
- return $arr;
- }
-//方法2
- function sort2($category,$parent_id=0,$level=0){
- $res=array();
- foreach($category as $c){
- if($c['parent_id']==$parent_id){
- $c['level']=$level;
- $arr[]=$c;
- $res=array_merge($arr,$this->sort2($category,$c['id'],$level+1));
- }
- }
- return $res;
- }
//方法3
- <pre code_snippet_id="2210996" snippet_file_name="blog_20170216_1_7442626" class="html" name="code"> /**
- * 得到分类级数,并将他们的上下级关系,体现在返回数组中
- * @param unknown $category
- * @param number $parent_id
- * @param number $level
- * @return multitype:array
- */
- function category($category,$parent_id=0,$level=0){
- $arr=array();
- foreach($category as $k=>$v){
- if($v['parent_id']==$parent_id){
- $v['level']=$level;
- $v['child']=$this->category($category,$v['id'],$level+1);
- $arr[]=$v;
- }
- }
- return $arr;
- }
一定要避过的大坑
解析JSON返回时出现数据格式不对无法打印的问题,可以通过浏览器查看元素发现在{}前多了空白不可见字符
项目第n次提交
1天气接口
2写接口,返回商品信息 $goods=file_get_contents($url);
bug写接口收到数据却无法打印出
原因:php输出包含空白隐形字符,在json前所以无法解析
解决方法
方法0:1 $fuhao1=strpos($goods,'{');2$goods=substr($goods,$fuhao);3$goods=json_decode($goods);
方法1:ob_clean()
方法2:文件删除,用sublime重新保存为utf8格式,切记不要用记事本保存
方法3:搜索去除utf-8文件的bom头的php代码
/**
* 生成一个长度为3-6之间的验证码
* @param int $len 验证码的长度
* @return void
*/
function makeCode($len=4){
// 限制验证码的长度在3-6之间
$len = ($len>6) ? 6 : $len;
$len = ($len<3) ? 3 : $len;
// 创建真彩色空画布
$img = imagecreatetruecolor(100, 40);
// 随机分配一个背景亮色
$bgColor = imagecolorallocate($img, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
imagefill($img, 0, 0, $bgColor); // 填充背景颜色
// 字体库
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// 字体最大索引下标
$maxIndex = strlen($str)-1;
$flag = 0;
while($flag<$len){
// 给字体分配随机颜色
$color = imagecolorallocate($img, mt_rand(0,180), mt_rand(0,180), mt_rand(0,180));
// 给验证码里面写字
$index = mt_rand(0,$maxIndex);
// 水平坐标
$x = (104-15*$len)/2+$flag*15;
imagestring($img, 5, $x, 10, $str{$index}, $color);
$flag++;
}
// 生成100个像素点(噪点)
for($i=0; $i<100; $i++){
$color = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
imagesetpixel($img, mt_rand(0,100), mt_rand(0,40), $color);
}
// 告诉浏览器以图像的形式打开
header('Content-type:image/jpeg');
// 输出
imagejpeg($img);
// 销毁
imagedestroy($img);
}
/**
* 上传一个文件
* @param array $file 上传文件的数组 里面有五个元素
* @param int $maxSize 上传文件允许的最大大小
* @param array $extArray 上传文件允许的扩展名数组
* @param array $mimeArray 上传文件允许的mime类型
* @param string $path 上传文件保存的路径
* @return array array('success'=>bool, 'error_code'=>错误编号, 'error_info'=>错误信息, 'save_path'=>上传文件保存的路径)
*/
function upload($file, $path, $maxSize=2097152, $extArray=array('jpg','png','gif','jpeg'), $mimeArray=array('image/jpeg','image/png','image/gif')){
// 判断系统错误
if($file['error']!=0){
return changeCode($file['error']);
}
// 判断逻辑错误
// 判断是否超过了自定义的大小限制
if($file['size']>$maxSize){
return changeCode(8);
}
// 判断文件扩展名是否符合规范
$ext = explode('.', $file['name']);
$ext = array_pop($ext);
if(!in_array($ext, $extArray)){
return changeCode(9);
}
// 安全需要
$finfo = finfo_open(FILEINFO_MIME);
$mime = finfo_file($finfo, $file['tmp_name']);
$mime = explode(';', $mime);
// 取出数组的第一个元素
$mime = array_shift($mime);
if(!in_array($mime, $mimeArray)){
return changeCode(5);
}
// 拼接年月日类型的文件夹
$destination = $path.date('Y-m-d-H-i',time());
if(!is_dir($destination)){
mkdir($destination, 0777, true);
}
$destination .= '/'.uniqid().'.'.$ext;
// 移动上传文件
if(
move_uploaded_file($file['tmp_name'], $destination)){
return array('success'=>true, 'error_code'=>0, 'error_info'=>'', 'save_path'=>$destination);
}
}
/**
* 转换上传文件错误信息
* @param int $error_code 上传文件的错误编号
* @return array array('success'=>bool, 'error_code'=>错误编号, 'error_info'=>错误信息, 'save_path'=>上传文件保存的路径)
*/
function changeCode($error_code){
switch($error_code){
// 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
case 1: $error_info = '上传文件过大';
break;
// 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
case 2: $error_info = '上传文件过大';
break;
// 文件只有部分被上传。
case 3: $error_info = '上传失败,请重新上传';
break;
// 没有文件被上传。
case 4: $error_info = '没有选择上传文件';
break;
// 找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
case 6: $error_info = '异常错误,请联系管理员';
break;
// 其值为 7,文件写入失败。PHP 5.1.0 引进。
case 7: $error_info = '异常错误,请联系管理员';
break;
// 超过了php端自定义的最大大小限制
case 8: $error_info = '上传文件过大';
break;
// 文件扩展名不符合规范
case 9: $error_info = '文件类型不正确';
break;
// 文件mime类型不正确
case 5: $error_info = '/(ㄒoㄒ)/~~';
break;
}
return array('success'=>false, 'error_code'=>$error_code, 'error_info'=>$error_info, 'save_path'=>'');
}
<!-- 5秒后跳转到http://www.baidu.com -->
<meta http-equiv="refresh" content="5;http://www.baidu.com" />
<!-- 5秒后刷新页面 -->
<meta http-equiv="refresh" content="5" />
// 5秒后跳转到http://www.baidu.com
header('refresh:5;http://www.baidu.com');
// 5秒后刷新页面
header('refresh:5');
Header("Location: $url");//用HTTP头信息
echo '<meta http-equiv="refresh" content="10;url=https://www.baidu.com">';//1、meta标签实现
<script>url="submit.php";window.location.href=url;</script>//2、JavaScript实现
例:<script>window.location.href = 'https://www.baidu.com';</script>;
<script>url="submit.php";window.open(\'url,\'\',\'_self\');</script>
header("Location: Url");//3、PHP页面重定向实现
//JS页面刷新
1,history.go(0)
2,location.reload()
3,location=location
4,location.assign(location)
5,document.execCommand('Refresh')
6,window.navigate(location)
7,location.replace(location)
8,document.URL=location.href