php企业项目开发常用函数封装(上)

将二维数组变为一维键值对

//将二维数组变为一维键值对
function arrayColumn($array, $column_key, $index_key = null)
{
    if (function_exists(array_column)) {
        $arr = array_column($array, $column_key, $index_key);
    } else {
        $arr = [];
        foreach ($array as $v) {
            $arr[$v[$index_key]] = $v[$column_key];
        }
    }
    return $arr;
}

将二维数组key替换

//将二维数组key替换
function arrayKeyReplace($array, $index_key)
{
    $arr = [];
    foreach ($array as $v) {
        $arr[$v[$index_key]] = $v;
    }
    
    return $arr;
}

输出json,并结束执行

//输出json,并结束执行
function showJson($code = 0, $message = '', $result = [], $options = 256)
{
    header('Content-Type:application/json; charset=utf-8');
    exit(json_encode(['code' => $code, 'message' => $message, 'response' => $result], $options));
}

curl发送请求,支持 get、post及上传文件

/**
 * @todo curl发送请求,支持 get、post及上传文件(格式:['filename'=>'@/path/file.png'])
 * @param string $url
 * @param array $param 格式 ['name'=>'张三','age'=>'18']
 * @param array $header 格式 ['Connection: keep-alive', 'Referer:http://www.t.loc']
 * @param bool $is_post 默认post请求
 * @param bool $is_upload 默认不支持文件上传
 * @param int $timeout 设置请求超时时间,单位秒
 * @return mixed
 */
function curlFunc($url, $param = [], $header = [], $is_post = true, $is_upload = false, $timeout = 8)
{
    if (!$is_post) {
        $get_str = '?';
        foreach ($param as $k => $v) {
            $get_str .= $k.'='.$v.'&';
        }
        $url .= rtrim($get_str, '&');
    }
    //true,支持文件上传
    if ($is_upload) {
        foreach ($param as $k => $v) {
            if (strpos($v, '@') === 0) {
                $v = ltrim($v, '@');
                $param[$k] = curl_file_create($v, mime_content_type($v));  //生成一个curl文件对象 php version >= 5.5
            }
        }
    }

    $ch = curl_init();
    //请求连接
    curl_setopt($ch, CURLOPT_URL, $url);
    //构造包头,模拟浏览器请求
    if (!empty($header)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }
    //设置请求超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    //https请求 不验证证书和hosts
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    //是否post请求 bool
    curl_setopt($ch, CURLOPT_POST, $is_post);
    if ($is_post) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
    }
    //设置返回结果是否返回 默认0 直接显示 1返回
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    //判断是否返回正常状态 200
    $status = curl_getinfo($ch);
    if ($status['http_code'] != 200) {
        throw new Exception('返回状态异常.');
    }
    curl_close($ch);

    return $result;
}

保存base64提交的图片文件

/**
 * 保存base64提交的图片文件
 * @author lhw
 * @param string $field_name    字段名称
 * @param bool $domain          是返回带域名url地址
 * @param array $config         默认配制,dir:保存的目录名称,相对路径或绝对路径;url:相对于域名访问的路径地址;ext:图片扩展名称;size:图片文件大小
 * @throws Exception
 * @return void|array           返回保存后带目录的文件名称和访问url地址
 */
function saveBase64Image($field_name = 'image', $domain = false, $config = [])
{
    //默认配制
    $conf = ['dir'=>'./Uploads/Image','url'=>'/Uploads/Image','ext'=>['png','jpg','jpeg','gif'],'size'=>2000000];
    if (!empty($config)) {
        //合并配制
        $conf = array_merge($conf, $config);
    }
    //$base64_image为图片的编码字符串
    $base64_image = isset($_POST[$field_name]) ? $_POST[$field_name] : '';
    if (empty($base64_image)) {
        unset($_POST[$field_name]);
        return ;
    }
    
    preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image, $result);
    if (count($result) != 3) {
        throw new Exception('图片数据不正确。');
    }
    $file_ext = strtolower($result[2]);
    if (!in_array($file_ext, $conf['ext'])) {
        throw new Exception('上传图片文件扩展不支持。');
    }
    if (strlen($base64_image) > $conf['size']) {
        throw new Exception('上传图片文件太大了。');
    }
    
    $date           = date('Ymd');
    $pathname       = $conf['dir'].'/'.$date;
    
    if (!is_dir($pathname) && !mkdir($pathname, 0777, true)) {
        throw new Exception('保存的图片目录没有权限。');
    }
    $name       = md5($base64_image).'.'.$file_ext;      //图片文件名加上图片扩展
    $savepath   = $pathname.'/'.$name;                  //图片保存目录
    //对图片进行解析并保存
    if (!file_put_contents($savepath, base64_decode(str_replace($result[1], '', $base64_image)))) {
        throw new Exception('保存图片文件失败。');
    }
    
    $server_name = '';
    if ($domain) {
        $server_name = '//'.$_SERVER['SERVER_NAME'];
        if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'https://') === 0) {
            $server_name = 'https:'.$server_name;
        }
    }
    
    $saveurl = $server_name.$conf['url'].'/'.$date.'/'.$name;
    $_POST[$field_name] = $saveurl;
    
    return ['dir'=>$savepath, 'url'=>$saveurl];
}

图片文件转base64格式

/ **
     * 图片文件转base64格式
     * @param string $image_file    图片文件地址
     * @param string $is_split      是否分割为块,默认否
     * @return string
     */
    function base64EncodeImage($image_file, $is_split = false)
    {
        $base64_image = '';
        if (file_exists($image_file)) {
            $image_info = getimagesize($image_file);
            $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
            $base64_image = 'data:' . $image_info['mime'] . ';base64,' . ($is_split ? chunk_split(base64_encode($image_data)) : base64_encode($image_data));
        }
        
        return $base64_image;
    }

读取Excel文件,支持xls

/**
 * 读取Excel文件,支持xls(03版excel格式)与xlsx(07版excel格式),自动根据上传文件后缀判断,目前只支持 A-Z
 * @param string $field_name    上传文件字段名称 
 * @param array $fields         读取字段名称数组,如果指定有数字key值,则以key值读取列,默认从0开始,如:['area_id','area_name'] 或[3=>'area_id',5=>'area_name']
 * @param number $start_row     起始行
 * @param number $end_row       结束行,如果大于能读取的行业,以能读取的为准,否只读取指定行数
 */
function readExcel($field_name, $fields, $start_row = 1, $end_row = 1000)
{
    if (!isset($_FILES[$field_name]['error']) || $_FILES[$field_name]['error'] !== 0) {
        throw new Exception('上传文件不存在');
    }
    $ext = substr($_FILES[$field_name]['name'], strrpos($_FILES[$field_name]['name'], '.'));
    if (!in_array($ext, array('.xls','.xlsx'))) {
        throw new Exception('上传文件格式不正确,只能为:.xls或.xlsx');
    }
    
    Vendor('PHPExcel');
    if ($ext == '.xls') {
        $objReader = \PHPExcel_IOFactory::createReader('Excel5');
    } else {
        $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
    }
    $objPHPExcel = $objReader->load($_FILES[$field_name]['tmp_name']);
    $sheet = $objPHPExcel->getSheet(0);
    $rows = $sheet->getHighestRow();        // 取得总行数
    if ($rows > $end_row) {
        $rows = $end_row;                   // 赋值给定行数
    }
    $cols = $sheet->getHighestColumn();     // 取得总列数
    $arr = array();
    $cols_range = range('A', 'Z');
    for ($i = $start_row; $i <= $rows; $i ++) {
        foreach ($fields as $k => $v) {
            $arr[$i][$v] = trim($sheet->getCell($cols_range[$k].$i)->getValue());
        }
    }
    
    return $arr;
}

通用导出excel文件

/**
 * 通用导出excel文件
 * @param string $title 导出文件名称
 * @param array $header 列键值与名称,最多支持26列,格式:['name'=>'名称','number'=>'数量']
 * @param array $data 二维数据列表
 * @param string $number2text 所有的数值转文本格式,默认否
 */
function exportExcel($title, $header, $data, $number2text = false)
{
    vendor('PHPExcel');//导入第三方类库
    $xls_title = $title;
    
    $file_name = $title.'_'.date('YmdHis');
    $excel = new \PHPExcel();
    $hk = array_keys($header);
    $o = $excel->getActiveSheet(0);
    //所有列水平居中
    $o->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    //所有列垂直居中
    //$o->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
    //单列居中
    //$o->getStyle('B')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    //单个列值居中
    //$o->getStyle('B1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    //列标题操作
    foreach ($hk as $kk => $kv) {
        $cols = chr($kk + 65); //转成A-Z
        $o->getColumnDimension($cols)->setWidth(mb_strlen($kv) * 2);
        if ($number2text) {
            $o->getColumnDimension($cols)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
        }
        $o->setCellValue($cols.'1', $header[$kv]);
    }
    //列内容操作,默认从第二行开始
    $i = 2;
    foreach ($data as $v) {
        foreach ($hk as $kk => $kv) {
            $cols = chr($kk + 65);
            $o->setCellValue($cols.$i, $v[$kv]);
        }
        $i ++;
    }

    header('Content-type:application/vnd.ms-excel;charset=utf-8');
    header("Content-Disposition:attachment;filename=".iconv('UTF-8', 'GBK', $file_name.'.xls'));
    header('Cache-Control: max-age=0');
    header('Expires:0');
    header('Pragma:public');
    
    $obj_writer=\PHPExcel_IOFactory::createWriter($excel,'Excel5');
    $obj_writer->save('php://output');
}

获取时间区间的月份表

/**
 * 获取时间区间的月份表
 * @param string|array $table 格式: wo_order | ['wo_order','wo_order_product']
 * @param int $start_time
 * @param int $end_time
 * @return array 
 */
function getTableMonth($table, $start_time, $end_time)
{
    $db_prefix = C('DB_PREFIX');
    $start_year = date('Y', $start_time);   //开始的年
    $end_year = date('Y', $end_time);       //结束的年
    $start_m = date('n', $start_time);      //开始的月
    $end_m = date('n', $end_time);          //结束的月
    $end_ym = date('Y_n', $end_time);       //结束的年月

    $table_list = [];

    $mdl = M();
    if ($start_year == $end_year) {
        for ($i = $start_m; $i <= $end_m; $i ++) {
            //年月表
            $ym = $start_year.'_'.$i;
            if (is_array($table)) {
                $temp_arr = [];
                foreach ($table as $v) {
                    if (!tableIsExist($db_prefix.$v.'_'.$ym)) {
                        break;
                    }
                    $temp_arr[$v] = $db_prefix.$v.'_'.$ym;
                }
                //表不存在跳过
                if (empty($temp_arr) || count($temp_arr) != count($table)) {
                    continue;
                }
                $table_list[] = $temp_arr;
            } else {
                if (!tableIsExist($db_prefix.$table.'_'.$ym)) {
                    continue;
                }
                
                $table_list[] = $db_prefix.$table.'_'.$ym;
            }
        }
    } else {
        for ($y = $start_year; $y <= $end_year; $y ++) {
            for ($i = ($y == $start_year ? $start_m : 1); $i <= 12; $i ++) {
                //年月
                $ym = $y.'_'.$i;
                
                if (is_array($table)) {
                    $temp_arr = [];
                    foreach ($table as $v) {
                        if (!tableIsExist($db_prefix.$v.'_'.$ym)) {
                            break;
                        }
                        $temp_arr[$v] = $db_prefix.$v.'_'.$ym;
                    }
                    //表不存在跳过
                    if (empty($temp_arr) || count($temp_arr) != count($table)) {
                        continue;
                    }
                    $table_list[] = $temp_arr;
                } else {
                    if (!tableIsExist($db_prefix.$table.'_'.$ym)) {
                        continue;
                    }
                    
                    $table_list[] = $db_prefix.$table.'_'.$ym;
                }
                
                $table_list[] = $ym;
                if ($ym == $end_ym) {
                    break 2;
                }
            }
        }
    }

    return $table_list;
}

判断表是否存在

/**
 * 判断表是否存在
 * @param string $table_name    完整表名
 * @return boolean
 */
function tableIsExist($table_name)
{
    $str_sql="SHOW TABLES LIKE '%{$table_name}%'";
    $r = M()->query($str_sql);
    
    return empty($r) ? false : true;
}

根据订单ID,获取订单月份表,并判断表是否存在

/**
 * 根据订单ID,获取订单月份表,并判断表是否存在
 * @param string $table_name        不含表前缀
 * @param string $my_order_id       订单号,注:年月日必须在其它数字的前面,日期前可以包含字母
 * @param string $return_prefix     是否返回含表前缀的表,默认 否
 * @return false|表名
 */
function getTableMonthById($table_name, $my_order_id, $return_prefix = false)
{
    $year = date('Y');
    $month = date('n');
    $len = strlen($my_order_id);
    for ($i = 0; $i < $len; $i ++) {
        if (ctype_digit($my_order_id[$i])) {
            $year = substr($my_order_id, $i, 4);
            $month = (int)substr($my_order_id, $i+4, 2);
            break;
        }
    }
    $full_table_name = $table_name.'_'.$year.'_'.$month;
    $str_sql="SHOW TABLES LIKE '%".C('DB_PREFIX')."{$full_table_name}%'";
    $r = M()->query($str_sql);
    
    return empty($r) ? false : ($return_prefix ? C('DB_PREFIX').$full_table_name : $full_table_name);
}

zip打包下载

/**
 * zip打包下载
 * @param array $file_arr 打包文件数组,格式:[['file' => 't.jpg', 'name'=>'营业执照'],['file' => 't.jpg', 'name'=>'营业执照2']];
 * @param string $down_name 下载文件名称
 */
function execZipPack($file_arr, $down_name = '资料下载')
{
    $zip_filename = tempnam(sys_get_temp_dir(), 'xz');
    $zip = new \ZipArchive;
    if ($zip->open($zip_filename, \ZipArchive::CREATE) !== TRUE) {
        exit('无法打开文件,或者创建zip文件失败');
    }
    foreach ($file_arr as $v) {
        //传过来的文件不存在,跳过
        if (!file_exists($v['file'])) {
            continue;
        }
        //第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下
        $zip->addFile($v['file'], isset($v['name']) && !empty($v['name']) ? $v['name'].'.'.pathinfo($v['file'], PATHINFO_EXTENSION) : basename($v['file']));
    }
    $zip->close();//关闭
    $name = iconv('UTF-8', 'GBK', $down_name.'.zip');
    header("Cache-Control: public");
    header("Content-Type: application/zip");                       //zip格式的 
    header('Content-disposition: attachment; filename='.$name);    //下载文件名 
    header("Content-Transfer-Encoding: binary");                   //告诉浏览器,这是二进制文件 
    header('Content-Length: '. filesize($zip_filename));           //告诉浏览器,文件大小
    @readfile($zip_filename);
   // sleep($sleep_del);
    @unlink($zip_filename);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值