PHP函数集合-一揽子方案

/** 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返回时出现数据格式不对无法打印的问题,可以通过浏览器查看元素发现在{}前多了&#65279空白不可见字符
项目第n次提交
1天气接口
2写接口,返回商品信息 $goods=file_get_contents($url);
bug写接口收到数据却无法打印出
原因:php输出包含空白隐形字符&#65279,在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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值