当前位置: 首页 > 后端技术 > PHP

[1]PHP实用自定义函数

时间:2023-03-29 17:21:08 PHP

前言我清楚地记得谁在我耳边说:“PHP是世界上最好的语言”,反正我没说,我听过这样的言论,毕竟我是胆小,我怎么敢在公开场合说这种话,关于“谁是最好的语言”,很久以前,IT行业有很多血腥的风声争论无果,我们别闹了,搬砖吧老实说...好了,虾米说完了,下面开始说正事,我会陆续写一些PHP开发中实用的自定义函数,方便使用的朋友,可以快速开发使用。返回格式化时间在开发过程中,我们总会遇到一些时间显示的问题。有时我们需要显示年月日,有时我们需要显示年月日时.分.秒。使用的时候会重复写一行类似date($time,'Y-m-dH:i:s')的代码。有没有更优雅的写法,就是自定义一个函数,定义如下在使用函数的时候,如果时间格式是默认的,那么直接调用函数time_format($time)即可传入时间戳。是不是觉得这样看着更舒服?/***返回格式化时间*@paramint$timetimestamp*@paramstring$formattimeformat*@returnbool|string*/functiontime_format($time=0,$format=''){//默认时间格式if(empty($format)){$format='Y-m-dH:i:s';}$format_time=date($format,$time);return$format_time;}关于数字格式处理的格式化数字当时想必大家也经常遇到,甚至在测试中因为某个数据显示的数字没有格式化而出现bug?反正我被测试抓到只好改了,比如:我没有保留两位小数等等,然后老老实实修改代码把之前没处理过的数字格式化,写法是number_format($number,2,'.',','),发现一口气传了4个参数,而且,如果$number不是数字,那么这个函数会报错,所以最好自定义一、方便快捷,直接用number_format_plus($number)就搞定了!/***返回格式化后的数字*@paramint$number待格式化的数字*@paramint$decimals保留小数位,默认2*@paramstring$dec_point整数和小数分隔符*@paramstring$thousands_sepinteger部分读取分隔符每三位数字*@returnstring*/functionnumber_format_plus($number=0,$decimals=2,$dec_point='.',$thousands_sep=','){$format_num='0.00';如果(is_numeric($number)){$format_num=number_format($number,$decimals,$dec_point,$thousands_sep);}return$format_num;}人民币数字小写转大写人民币转大写,这个在合同文档中一般会遇到,因为在之前的工作中接触过一些合同,所以一直在使用这个函数。好的东西当然要分享,以备不时之需。paramstring$int_unit货币单位,默认为"元",有的要求可能是"round"*@parambool$is_round是否对小数进行四舍五入*@parambool$is_extra_zero整数部分是否以0结尾,小数存在加0,比如1960.30*@returnstring*/functionrmb_format($money=0,$int_unit='yuan',$is_round=true,$is_extra_zero=false){//非数字,原样返回if(!is_numeric($money)){返回$money;}//将数字分成两部分$parts=explode('.',$money,2);$int=isset($parts[0])?strval($parts[0]):'0';$dec=isset($parts[1])?strval($parts[1]):'';//如果小数点后超过2位则截断不四舍五入,否则处理$dec_len=strlen($dec);如果(isset($parts[1])&&$dec_len>2){$dec=$is_round?substr(strrchr(strval(round(floatval("0.".$dec),2)),'.'),1):substr($parts[1],0,2);}//当number为0.001时,小数点后为0元if(empty($int)&&empty($dec)){return'zero';}//定义$chs=['0','1','2','3','4','5','6','7','8','9'];$uni=['','1','百','千'];$dec_uni=['角度','分'];$exp=['','一万'];$res='';//从右到左查找整数部分for($i=strlen($int)-1,$k=0;$i>=0;$k++){$str='';//根据中国人的读写习惯,每4个字符换算成一个段落,i一直减去for($j=0;$j<4&&$i>=0;$j++,$i--){//在非零数后加上单位$u=$int{$i}>0?$uni[$j]:'';$str=$chs[$int{$i}].$你。$海峡;}//删除尾随的0$str=rtrim($str,'0');//替换多个连续的零$str=preg_replace("/0+/","zero",$str);if(!isset($exp[$k])){//构建单元$exp[$k]=$exp[$k-2].'十亿';}$u2=$str!=''?$exp[$k]:'';$res=$str。$u2。$资源;}//如果处理后小数部分为00,则需要处理$dec=rtrim($dec,'0');//从左到右查找小数部分if(!empty($dec)){$res.=$int_unit;//整数部分0是否追加0结尾的数,有些系统有这个要求if($is_extra_zero){if(substr($int,-1)==='0'){$res.='零';}}for($i=0,$cnt=strlen($dec);$i<$cnt;$i++){//在非零数后添加单位$u=$dec{$i}>0?$dec_uni[$i]:'';$res.=$chs[$dec{$i}].$你;如果($cnt==1)$res.='whole';}//去掉最后的0$res=rtrim($res,'0');//替换多个连续的零$res=preg_replace("/0+/","zero",$res);}else{$res.=$int_unit.'所有的';}返回$res;}生成短网址国内有很多短网址生成接口,但是我发现国外tinyurl.com提供的短网址接口用起来很方便。生成短链接需要直接传入URL。至于安全性和速度性能?是的,我们再说一遍。之前也写过一篇关于新浪短网址生成的文章。如果您有兴趣,可以查看一下。文章入口-新浪微博API生成短链接/***获取短URL链接*@paramstring$url原始网址*@returnstring*/functionget_short_url($url=''){//直接请求第三方接口地址获取短网址$api_url='http://tinyurl.com/api-create.php?网址=';$short_url=file_get_contents($api_url.$url);return$short_url;}获取用户真实IP地址在分析用户行为和操作日志的时候,肯定会遇到获取用户IP地址的需求。因为在互联网上,最有效、最直接的定位用户的方式就是IP地址。当然,有些人使用代理或其他方式修改IP地址,可能会导致通过这种方式获取到的IP地址不准确。但是一般情况下,这个方法是获取用户的。IP地址完全够了/***获取用户的真实IP地址*@returnmixed*/functionget_real_ip(){if(!empty($_SERVER['HTTP_CLIENT_IP'])){$ip=$_SERVER['HTTP_CLIENT_IP'];}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}else{$ip=$_SERVER['REMOTE_ADDR'];}返回$ip;}导出excel表格数据我们常用的导出Excel表格的库类有PHPExcel等,但是如果想直接导出Excel表格数据而不使用任何库类,当然有办法,就是直接使用html表格形式生成表格数据并将其导出。/***导出excel表格数据*@paramarray$data表格数据,二维数组*@paramarray$title第一行标题,一维数组*@paramstring$filename下载的文件名*/functionexport_excel($data=[],$title=[],$filename=''){//默认文件名是时间戳if(empty($filename)){$filename=time();}//定义输出头信息header("Content-type:application/octet-stream;charset=GBK");标头(“接受范围:字节”);header("Content-type:application/vnd.ms-excel");header("Content-Disposition:attachment;filename=".$filename.".xls");header("Pragma:无缓存");header("过期:0");ob_start();echo"\n";//exportxlsstart,先写headerif(!empty($title)){foreach($titleas$k=>$v){$title[$k]=iconv("UTF-8","GBK//忽略",$v);}$title="".内爆(“\t”,$title)."";echo"$title\n";}//再次写入表数据if(!empty($data)){foreach($dataas$key=>$val){foreach($valas$ck=>$cv){if(is_numeric($cv)&&strlen($cv)<12){$data[$key][$ck]=''.mb_convert_encoding($cv,"GBK","UTF-8")。"";}else{$data[$key][$ck]=''.iconv("UTF-8","GBK//IGNORE",$简历)。"";}}$data[$key]="".implode("\t",$data[$key])。"";}echo内爆("\n",$data);}echo"";ob_flush();exit;}downloadFiles(支持断点续传)有时,我们从网上下载文件,但有时下载的文件很大,在下载到一半或即将完成时,突然出现网络故障,导致无法下载暂停和中断。如果后面网络恢复了,还得重新开始下载,是不是诅咒,但是,如果网络恢复了,可以从网络中断前的位置继续下载,是不是又开心了?当然,我们希望是这样,但是一些无良开发者可能不会让你开心,那么你是想做一个不如意的无良开发者还是好人呢?我劝大家做个善良的人,哈哈哈/***支持断点续传,下载文件*@paramstring$file下载文件的完整路径*/functiondownload_file_resume($file){//判断文件是否存在if(!is_file($file)){die("非法文件下载!");}//打开文件$fp=fopen("$file","rb");//获取文件大小$size=filesize($file);//获取文件名$filename=basename($file);//获取文件扩展名$file_extension=strtolower(substr(strrchr($filename,"."),1));//指出按扩展格式浏览的输出switch($file_extension){case"exe":$ctype="application/octet-stream";休息;case"zip":$ctype="application/zip";休息;case"mp3":$ctype="audio/mpeg";休息;case"mpg":$ctype="video/mpeg";休息;case"avi":$ctype="video/x-msvideo";休息;默认值:$ctype="应用程序/强制下载";}//通用头头信息header("Cache-Control:");标头(“缓存控制:public");header("Content-Type:$ctype");header("Content-Disposition:attachment;filename=$filename");header("Accept-Ranges:bytes");//如果$_SERVER['HTTP_RANGE']parameterif(isset($_SERVER['HTTP_RANGE'])){//断点后重新连接$_SERVER['HTTP_RANGE']的值list($a,$range)=explode("=",$_SERVER['HTTP_RANGE']);str_replace($range,"-",$range);//文件总字节数$size2=$size-1;//获取下一次下载的长度$new_length=$size2-$range;header("HTTP/1.1206PartialContent");//输入总长度header("Content-Length:$new_length");header("Content-Range:bytes$range$size2/$size");//设置指针位置fseek($fp,$range);}else{//第一次连接下载$size2=$size-1;header("Content-Range:bytes0-$size2/$size");//输出总长度header("Content-Length:".$size);}//虚幻输出while(!feof($fp)){//设置最大文件执行时间set_time_limit(0);//输出文件打印(f读取($fp,1024*8));//输出缓冲区flush();ob_flush();}fclose($fp);exit;}最后我会在第一篇分享这些功能,其他实用的功能以后会慢慢更新。如果您还有其他好玩好用的功能,欢迎分享。让我们一起学习和交流。如有不对或错误的地方,请指出。我会努力改进的,谢谢。