将二维数组变为一维键值对
//将二维数组变为一维键值对
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);
}