PHP常用函数,记录下
/**
* UTF-8编码 GBK编码相互转换/(支持数组)
*
* @param array $str 字符串,支持数组传递
* @param string $in_charset 原字符串编码
* @param string $out_charset 输出的字符串编码
* @return array
*/
function array_iconv($str, $in_charset="gbk", $out_charset="utf-8"){
if(is_array($str)){
foreach($str as $k => $v){
$str[$k] = array_iconv($v);
}
return $str;
}else{
if(is_string($str)){
// return iconv('UTF-8', 'GBK//IGNORE', $str);
return mb_convert_encoding($str, $out_charset, $in_charset);
}else{
return $str;
}
}
}
/**
*gbk转utf-8 简单转换
*@param $data
*@return array
*/
function gbk2utf8($data){
if(is_array($data)){
return array_map('gbk2utf8', $data);
}
return iconv('gbk','utf-8',$data);
}
/**
*导出Excel文档数据
*@param str $title 导出文档名称
*@param array $header 导出文档字段标题
*@param array $field 方便与标题对齐的标题
*@param array $data 文档的内容数据
*@param str $dir 导出文档保存地址(type=2时为生成的临时文件地址)
*@param str $ext 导出文档后缀格式,默认xls
*@param str $type 导出类型(1:只保存不下载,2:只下载不保存)
*@return str 文件地址
*示例:
*$title = 'test';
*$header = array('ID','用户名','联系方式');
*$field = array('0','1','2');
*$data = array(
*array($field[0]=>'1',$field[1]=>'小明',$field[2]=>'123456'),//直接用$field数组数据
*array('0'=>'2','1'=>'xiaolan','2'=>'124578'),//直接与$field数据一样
*array('0'=>'3','1'=>'xiaohei','2'=>'147852'),
*array('0'=>'4','1'=>'xiaodian','2'=>'1598753'),
*);
*$dir = 'excel/excel/';
*export_excel($title,$header,$field,$data,$dir);
*/
function export_excel($title,$header,$field,$data,$dir,$ext='.xls',$type=2){
ob_clean();
header("Content-type:text/html;charset=utf-8");
require_once 'diyupload/excel/PHPExcel.php';// 引入phpexcel
$data=array_iconv($data);//数据编码转换
$header=array_iconv($header);//数据编码转换
$phpexcel = new PHPExcel();
// 设置表头
$chr = 65;
foreach($header as $k=>$v){
$phpexcel->setActiveSheetIndex(0)->setCellValue(chr($chr).'1', $v);
$chr++;
}
// 标签名
$phpexcel->getActiveSheet()->setTitle($title);
// 使用第一个表
$phpexcel->setActiveSheetIndex(0);
$objWriter = new PHPExcel_Writer_Excel5($phpexcel);
//$objWriter = new PHPExcel_Writer_Excel2007($phpexcel);
foreach ($data as $key => $value) {
//表格是从2开始的 因为上面还有表头
$i = $key + 2;
$chr = 65;
foreach($field as $v){
$phpexcel->getActiveSheet()->setCellValue(chr($chr) . $i, $value[$v]);//这里是设置单元格的内容
$chr++;
}
}
if (!is_dir($dir)) {
mkdir($dir, 0777, TRUE);
}
$filename = $dir . time() . rand(10000, 99999) . $ext;
$objWriter->save($filename);
//exit;
if($type==1){//导出表格到文件夹
return $filename;
}elseif($type==2){//导出表格到下载
downdetails($filename);
unlink($filename);
return $filename;
}
}
/**
*从某文件夹中将文件下载
*@param str $file_path 文件所在地址,包含文件名
*
*/
function downdetails($file_path){
ob_clean();//下载前先清空缓存区,需要PHP开启ob
header("Content-type:text/html;charset=utf-8");
//$file_path="testMe.txt";
//用以解决中文不能显示出来的问题
//$file_name=iconv("utf-8","gb2312",$file_name);
//$file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/";
//$file_path=$file_sub_path.$file_name;
//首先要判断给定的文件存在与否
if(!file_exists($file_path)){
echo "没有该文件文件";
return ;
}
$fp=fopen($file_path,"r");
$file_size=filesize($file_path);
$file_name=time().'.xls';
//下载文件需要用到的头
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".$file_name);
$buffer=1024;
$file_count=0;
//向浏览器返回数据
while(!feof($fp) && $file_count<$file_size){
$file_con=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_con;
}
fclose($fp);
}
/**
*PHP下载,无其他插件
*@param str $postname form对应input标签中的ID值
*@param str $dir 需要上传之后保存的路径
*@param array $filtype 允许上传的文件类型(为空则默认为jpg,jpeg,gif,png)
*@return str 成功上传返回路径与名称,失败返回提示语
*
*/
function uploads($postname,$dir,$filtype){
$tempFile = $_FILES[$postname]['tmp_name'];
if(empty($filtype) or isset($filtype)){
$fileTypes = array('jpg','jpeg','gif','png');//默认允许上传的文件类型
}else{
$fileTypes=$filtype;
}
$fileParts = pathinfo($_FILES[$postname]['name']);
$extension = strtolower($fileParts['extension']);
$name = date('mdHis').'-'.rand(100,999).'.'.$extension;
$targetFolder = '/'.$dir;
if(!is_dir($targetFolder)){mkdir($targetFolder,0777,TRUE);}
@chmod($targetFolder,0777);
$loca = $targetFolder.'/'.$name;
if(in_array($extension,$fileTypes)) {
if(copy($tempFile,$loca)){
return $dir.'/'.$name;
}
}else{
return '上传失败';
}
}
/**
*获取客户端IP地址
*@return str $ip 返回客户端IP地址
*
*/
function get_real_ip(){
$ip=false;
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']);
if($ip){ array_unshift($ips, $ip); $ip=FALSE; }
for ($i=0; $i < count($ips); $i++){
if(!eregi ('^(10│172.16│192.168).', $ips[$i])){
$ip=$ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
/**
*将字符串或数组转为json对象
*@param str or array $data 待转换数据
*@param str $charset 数据编码类型
*@return json
*/
function fix_json( $data,$charset = 'utf-8'){
if( is_string( $data ) ){
$data = preg_replace("/([\r\n\t\f])/"," ",$data);
$temp = array();
if( $charset == "gbk" ){
$array = json_decode(iconv('GBK', 'UTF-8', $data),true);
if( is_array($array) ){
foreach ($array as $key => $val){
$temp[ iconv('UTF-8',$charset, $key) ] = iconv('UTF-8', $charset, $val);
}
}
}else{
$temp = json_decode($data,true);
}
}else{
$temp = array();
if( $charset == "gbk" && PHP_VERSION >= '5.2' ){
foreach ($data as $key => $val){
$temp[ iconv($charset,'UTF-8', $key) ] = iconv( $charset,'UTF-8', $val);
}
}else{
$temp = $data;
}
$temp = json_encode($temp);
}
return $temp;
}
/**
*多维数组转一维数组
*@param array $multi 待转的多维数组数据
*@return array
*/
function arrToOne($multi) {
$arr = array();
foreach ($multi as $key => $val) {
if( is_array($val) ) {
$arr = array_merge($arr, arrToOne($val));
} else {
$arr[] = $val;
}
}
return $arr;
}
说明:Excel导出和问卷下载前最好使用ob_clean()清除缓存区,可避免乱码和文件损坏,ob_clean()需要PHP开启ob