php 常用自定义函数
文件类
获取某个tp根目录下面的某个目录
//获取uploads 文件夹路径
function uploads_path(){
return dirname(__DIR__).DIRECTORY_SEPARATOR.'uploads/';
}
获取文件路径不带扩展名
//获取文件路径不带扩展名
function getPathClearExt($path){
return substr($path,0, strripos($path,'.'));
}
获取文件路径文件名
function getFileName($path){
return substr($path,strripos($path,'/') + 1 );
}
获取文件路径扩展名
function getExt($path){
return substr($path,strripos($path,'.') + 1 );
}
删除某个目录下的文件
/**
* 删除某个目录下的文件
*
* 主要用来删除上传文件的临时文件
*/
function deleteFile($path){
//如果是目录则继续
if(is_dir($path)){
//扫描一个文件夹内的所有文件夹和文件并返回数组
$p = scandir($path);
foreach($p as $val){
//排除目录中的.和..
if($val !="." && $val !=".."){
//如果是目录则递归子目录,继续操作
if(is_dir($path.$val)){
//子目录中操作删除文件夹和文件
deleteFile($path.$val.'/');
//目录清空后删除空文件夹
@rmdir($path.$val.'/');
}else{
//如果是文件直接删除
unlink($path.$val);
}
}
}
}
}
读取文件夹下所有文件
/**
* 读取文件夹下所有文件
* @param $folder
* @return mixed
*/
function scanfiles($dir){
$arr = array();
//列出文件下的目录
$hander = scandir($dir);
//遍历文件夹下所有文文件
foreach ($hander as $v) {
//判断文件夹下是否还有文件夹需要遍历
if (is_dir($dir . '/' . $v) && $v != "." && $v != "..") {
//有二级文件夹
return false;
//递归调用
$arr[$v] = scanfiles($dir . '/' . $v);
}else{
//排除 "." " .."
if($v != "." && $v != ".."){
//文件存入
$arr[]=$v;
}
}
}
return $arr;
}
读取文件内容至字符串中,同时去除换行、行首行尾空格
/**
* 读取文件内容至字符串中,同时去除换行、行首行尾空格
* @param string $filePath
* @return string|string[]|null
*/
function readFileAndTrim($filePath = ''){
if(empty($filePath)){
return '文件路径为空';
}
return preg_replace('/((s)*(
)+(s)*)/i',',',file_get_contents($filePath));
}
随机数
任意字符随机
/**
* 随机生成id,默认10位,不要O,o,0
* @param integer $length 生成id的位数
* @return string 生成的随机id
*/
function getRandomChar($length = 10){
// 密码字符集,可任意添加你需要的字符
//$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$chars = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz123456789';
$str = "";
for ( $i = 0; $i < $length; $i++ ){
$str .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $str ;
}
随机验证码
/**
* @param int $len 生成随机数长度,默认为6
* @return string
*/
//随机数
function getRandomCode($length = 6) {
//取10的长度减1次方的值,例:length为6 10的5次方 100000
$min = pow(10 , ($length - 1));
//取10的长度次方的值,例:length为6 10的6次方减1 999999
$max = pow(10, $length) - 1;
//获取并返回该范围的数
return mt_rand($min, $max);
}
字符串类
将id分割为2位一组的数组
/**
* 将id分割为2位一组的数组
* @param [type] $str 要分割的字符串
* @return array
*/
function stringToArray($str = null){
if($str === null){
return false;
}
$arr = array();
for($i = 0, $j = 0; $i < strlen($str); $i+=2,$j++){
$arr[$j] = substr($str,$i,2);
}
return $arr;
}
字符串编码转换
/**
* 对数据进行编码转换
* @param array/string $data 数组
* @param string $output 转换后的编码
* Created on 2016-7-13
*/
function array_iconv($data, $output = 'utf-8') {
$encode_arr = array('UTF-8','ASCII','GBK','GB2312','BIG5','JIS','eucjp-win','sjis-win','EUC-JP');
$encoded = mb_detect_encoding($data, $encode_arr);
if (!is_array($data)) {
return mb_convert_encoding($data, $output, $encoded);
}
else {
foreach ($data as $key=>$val) {
$key = array_iconv($key, $output);
if(is_array($val)) {
$data[$key] = array_iconv($val, $output);
} else {
$data[$key] = mb_convert_encoding($data, $output, $encoded);
}
}
return $data;
}
}
请求参数字符串转数组
/* 将一个字符串转变成键值对数组
* @param : string str 要处理的字符串 $str ='name=123&sex=1&num=12';
* @param : string sp 键值对分隔符
* @param : string kv 键值分隔符
* @return : array*/
function str2arr ($str,$sp="&",$kv="=")
{
$arr = str_replace(array($kv,$sp),array('"=>"','","'),'array("'.$str.'")');
eval("$arr"." = $arr;"); // 把字符串作为PHP代码执行
return $arr;
}
判断类
判断一个字符串是否是颜色值
/**
* 判断字符串是否是颜色值,如:#FFFFFF
* @param $str
* @return bool
*/
function isColor($str){
$match = '/^#([0-9a-fA-F]{6})$/';
if(preg_match($match, $str)){
return true;
}
return false;
}
数组类
对象转数组
/**
* 对象转换成数组
* @param $obj
*/
function objToArray($obj)
{
return json_decode(json_encode($obj), true);
}
对象数组自定义排序
usort($result, function ($object1, $object2){
//倒叙
return $object1->create_time < $object2->create_time;
});
删除关联数组的空值
/**
* 删除数组中value为空的
*/
function delArrayEmptyValue($array = []){
foreach ($array as $key => $value) {
if(!isset($value) || empty($value)){
unset($array[$key]);
}
}
return $array;
}
过滤数组中的空值和重复值
function filterEmptyRepeatValue($arr = array()){
$tmpArr = array();
foreach ($arr as $key => $value) {
if(!empty($value) && !in_array($value, $tmpArr)){
array_push($tmpArr, $value);
}
}
return $tmpArr;
}
数组转请求参数字符串
也可以使用http_build_query()
/**
* 数组转请求参数字符串
* @param $array 要处理的数组
* @return string 如:name=123&sex=1&num=12
*/
function arrayToString($array){
$string = [];
if($array && is_array($array)){
foreach ($array as $key=> $value){
$string[] = $key.'='.$value;
}
}
return implode('&',$string);
}
SHA256WithRSA签名和验签
生成签名
//生成 sha256WithRSA 签名
function getSign($content, $privateKey){
$privateKey = "-----BEGIN RSA PRIVATE KEY-----
" .
wordwrap($privateKey, 64, "
", true) .
"
-----END RSA PRIVATE KEY-----";
$key = openssl_get_privatekey($privateKey);
openssl_sign($content, $signature, $key, "SHA256");
openssl_free_key($key);
$sign = base64_encode($signature);
return $sign;
}
验证签名
//验证 sha256WithRSA 签名
function verify($content, $sign, $publicKey){
$publicKey = "-----BEGIN PUBLIC KEY-----
" .
wordwrap($publicKey, 64, "
", true) .
"
-----END PUBLIC KEY-----";
$key = openssl_get_publickey($publicKey);
$ok = openssl_verify($content,base64_decode($sign), $key, 'SHA256');
openssl_free_key($openssl_public_key);
return $ok;
}
zip压缩与解压
压缩
/**
* 压缩文件
* @param array $files 待压缩文件 array('d:/test/1.txt','d:/test/2.jpg');【文件地址为绝对路径】
* @param string $filePath 输出文件路径 【绝对文件地址】 如 d:/test/new.zip
* @return string|bool
*/
function zip($files, $filePath)
{
//检查参数
if (empty($files) || empty($filePath)) {
return false;
}
//压缩文件
$zip = new ZipArchive();
$zip->open($filePath, ZipArchive::CREATE);
foreach ($files as $key => $file) {
//检查文件是否存在
if (!file_exists($file)) {
return false;
}
$zip->addFile($file, basename($file));
}
$zip->close();
return true;
}
解压
注意:最好使用winrar 工具压缩的压缩包,其他的压缩包工具解压出来文件名会乱码
/**
* zip解压方法
* @param string $filePath 压缩包所在地址 【绝对文件地址】d:/test/123.zip
* @param string $path 解压路径 【绝对文件目录路径】d:/test
* @return bool
*/
function unzip($filePath, $path)
{
if (empty($path) || empty($filePath)) {
return false;
}
$zip = new ZipArchive();
if ($zip->open($filePath) === true) {
$zip->extractTo($path);
$zip->close();
return true;
} else {
return false;
}
}
图片类
图片转Base64编码
/**
* 获取图片的Base64编码(不支持url)
*
* @param $img_file 传入本地图片地址
*
* @return string
*/
function imgToBase64($img_file) {
$img_base64 = '';
if (file_exists($img_file)) {
$app_img_file = $img_file; // 图片路径
$img_info = getimagesize($app_img_file); // 取得图片的大小,类型等
//echo '<pre>' . print_r($img_info, true) . '</pre><br>';
$fp = fopen($app_img_file, "r"); // 图片是否可读权限
if ($fp) {
$filesize = filesize($app_img_file);
$content = fread($fp, $filesize);
$file_content = chunk_split(base64_encode($content)); // base64编码
switch ($img_info[2]) { //判读图片类型
case 1: $img_type = "gif";
break;
case 2: $img_type = "jpg";
break;
case 3: $img_type = "png";
break;
}
$img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码
}
fclose($fp);
}
return $img_base64; //返回图片的base64
}
时间类
求两个日期之间相差的天数
/**
* 求两个日期之间相差的天数
* (针对1970年1月1日之后,求之前可以采用泰勒公式)
* @param string $day1
* @param string $day2
* @return number
*/
function diffBetweenTwoDays($day1, $day2)
{
$second1 = strtotime($day1);
$second2 = strtotime($day2);
if ($second1 < $second2) {
$tmp = $second2;
$second2 = $second1;
$second1 = $tmp;
}
return ($second1 - $second2) / 86400;
}
$day1 = "2020-11-12 14:24:00";
//当前时间
$day2 = date('Y-m-d H:i:s',strtotime('now'));
//向上取整
$diff = ceil(diffBetweenTwoDays($day1, $day2));
echo $diff . "
";