$code,MSG_NAME=>$msg,'data'=>$data,'extend'=>$extend]; } } if(!function_exists('res')){ /** * @title: json格式返回结果 * @desc: 描述 * @param {*} $code * @param {*} $msg * @param {*} $data * @param {*} $extend * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 15:48:22 */ function res($code,$msg,$data=[],$extend=[]){ return json([STATUS_NAME=>$code,MSG_NAME=>$msg,'data'=>$data,'extend'=>$extend]); } } if(!function_exists('pageRes')){ /** * @title: json格式返回分页结果 * @desc: 描述 * @param {*} $code * @param {*} $msg * @param {*} $totalcount * @param {*} $data * @param {*} $extend * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 15:49:28 */ function pageRes($code,$msg,$totalcount=0,$data=[],$extend=[]){ return json([STATUS_NAME=>$code,MSG_NAME=>$msg,'totalCount'=>$totalcount,'data'=>$data,'extend'=>$extend]); } } if(!function_exists('encrypt')){ /** * @title: 通用密码加密 * @desc: 描述 * @param {*} $safecode * @param {*} $password * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 15:52:35 */ function encrypt($safecode,$password){ return base64_encode(md5(md5($safecode).md5($password))); } } if(!function_exists('CheckEncrypt')){ /** * @title: 通用密码校验 * @desc: 描述 * @param {*} $safecode * @param {*} $password * @param {*} $ciphertext * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 15:53:17 */ function CheckEncrypt($safecode,$password,$ciphertext){ $check_ciphertext=base64_encode(md5(md5($safecode).md5($password))); if($check_ciphertext==$ciphertext){ return true; }else{ return false; } } } if(!function_exists('HiddenMobile')){ /** * @title: 隐藏手机号部分数字 * @desc: 描述 * @param {*} $mobile * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 16:00:19 */ function HiddenMobile($mobile){ return substr_replace($mobile,'*****',3,4); } } if(!function_exists('HiddenIdcard')){ /** * @title: 隐藏身份证部分字符 * @desc: 描述 * @param {*} $Idcard * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 16:01:04 */ function HiddenIdcard($Idcard){ return substr_replace($Idcard,'************',4,12); } } if(!function_exists('str_prefix')){ /** * @title: 在字符串前生成指定数量的字符 * @desc: 若规定生成后字符串的长度,可使用PHP函数str_pad * @param {string} {str} {} {待补齐的字符串} * @param {int} {n} {} {补齐的数量} * @param {string} {char} {} {补齐的字符} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 16:02:37 */ function str_prefix($str, $n=1, $char=" "){ for ($x=0;$x<$n;$x++){$str = $char.$str;} return $str; } } if(!function_exists('str_suffix')){ /** * @title: 在字符串后生成指定数量的字符 * @desc: 若规定生成后字符串的长度,可使用PHP函数str_pad * @param {string} {str} {} {待补齐的字符串} * @param {int} {n} {} {补齐的数量} * @param {string} {char} {} {补齐的字符} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 16:04:06 */ function str_suffix($str, $n=1, $char=" "){ for ($x=0;$x<$n;$x++){$str = $str.$char;} return $str; } } if(!function_exists('ClearHtml')){ /** * @title: 清除字符串中的html标记 * @desc: 描述 * @param {*} $str * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 16:07:23 */ function ClearHtml($str) { $str = strip_tags($str); $str = trim($str);//首先去掉头尾空格 $str = preg_replace('/\s(?=\s)/', '', $str);//接着去掉两个空格以上的 $str = preg_replace('/[\n\r\t]/', ' ', $str);//最后将非空格替换为一个空格 return $str; } } if(!function_exists('GetRandStr')){ /** * @title: 获取指定长度的随机字符串(包含英文大小写及数字) * @desc: 描述 * @param {*} $length * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 17:05:34 */ function GetRandStr($length = 6) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $random_str = ''; for ($i = 0; $i < $length; $i++) { $random_str .= $chars[mt_rand(0, strlen($chars) - 1)]; } return $random_str; } } if(!function_exists('GetRandStrNotNum')){ /** * @title: 获取指定长度的随机字符串(包含英文大小写) * @desc: 描述 * @param {*} $length * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 17:06:39 */ function GetRandStrNotNum($length = 6) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $random_str = ''; for ($i = 0; $i < $length; $i++) { $random_str .= $chars[mt_rand(0, strlen($chars) - 1)]; } return $random_str; } } if(!function_exists('s')){ /** * @title: 格式化输出变量 * @desc: 描述 * @param {*} $val * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 17:09:06 */ function s($val){ echo "
";
		if(is_array($val)){
			print_r($val);
		}elseif(is_object($val)){
			var_dump($val);
		}else{
			echo $val;
		}
		echo "
"; } } if(!function_exists('IsUTF8')){ /** * @title: 检测字符串是不是UTF-8的字符集 * @desc: 描述 * @param {*} $string * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 17:10:26 */ function IsUTF8($string) { return preg_match('%^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )*$%xs', $string); } } if(!function_exists('NumToChina')){ /** * @title: 阿拉伯数字转大写中文 * @desc: 描述 * @param {string} {num} {} {待转换的数字} * @param {boolean} {type} {true} {是否大写中文} * @param {boolean} {mode} {true} {是否去除前面的0} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 17:11:13 */ function NumToChina($num,$type=true, $mode = true) { if($type){ $char = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); $dw = array('','拾','佰','仟','','万','亿','兆'); $dec = '點'; }else{ $char = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九'); $dw = array('', '十', '百', '千', '', '万', '亿', '兆'); $dec = '点'; } $retval = ''; if ($mode) { preg_match_all('/^0*(\d*)\.?(\d*)/', $num, $ar); } else { preg_match_all('/(\d*)\.?(\d*)/', $num, $ar); } if ($ar[2][0] != '') { $retval = $dec . NumToChina($ar[2][0],$type, false);//如果有小数,先递归处理小数 } if ($ar[1][0] != '') { $str = strrev($ar[1][0]); for ($i = 0; $i < strlen($str); $i++) { $out[$i] = $char[$str[$i]]; if ($mode) { $out[$i] .= $str[$i] != '0' ? $dw[$i % 4] : ''; if (@$str[$i] + @$str[$i - 1] == 0) { $out[$i] = ''; } if ($i % 4 == 0) { $out[$i] .= $dw[4 + floor($i / 4)]; } } } $retval = join('', array_reverse($out)) . $retval; } return $retval; } } if(!function_exists('moneyToChina')){ /** * @title: 数字金额转大写 * @desc: 描述 * @param {*} $money * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 10:33:07 */ function moneyToChina($money) { $txt = NumToChina($money); $result = ''; $txtAry = explode('點',$txt); //整数部分 $partA = $txtAry[0]; $partALen = mb_strlen($partA,'utf8'); for($i=0;$i<$partALen;$i++){ $k = mb_substr($partA,$i,1); $w = mb_substr($partA,$i+1,1); if($k!='零' || !in_array($w,['拾','佰','仟','万','亿','兆',''])){ $result.=$k; } } $result .= '圆'; //小数部分 $partB = $txtAry[1]??''; $partBLen = mb_strlen($partB,'utf8'); if($partB==str_repeat('零',$partBLen)){ $partB = ''; } if(empty($partB)){ $result.='整'; return $result; } for($i=0;$i<3;$i++){ $k = mb_substr($partB,$i,1); $w = mb_substr($partB,$i+1,1); if($k=='零' && $w=='零'){ $result.='零'; $i++; }elseif($k!='零' && $k!=''){ if(0==$i){ $result.=$k.'角'; }elseif(1==$i){ $result.=$k.'分'; }elseif(2==$i){ $result.=$k.'厘'; } }elseif($w!='零' && $w!=''){ $result.=$k; } } return $result; } } if(!function_exists('WLog')){ /** * @title: 快速写日志 * @desc: 文件存储日志 * @param {*} $LogFileName * @param {*} $info * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 10:34:59 */ function WLog($LogFileName, $info = "") { $TimeName = date("Y-m-d"); $LogFilePath = RUNTIME_PATH . 'developer_log' .DS . $LogFileName .DS. $TimeName . ".log"; if(!is_dir(dirname($LogFilePath))){ mkdir(dirname($LogFilePath),0777,true); } if(!is_string($info)){ $info = json_encode($info,JSON_UNESCAPED_UNICODE); } $Countent = "[" . date('Y-m-d H:i:s') . "]-INFO:" . $info . "\r\n"; return file_put_contents($LogFilePath, $Countent, FILE_APPEND); } } if(!function_exists('slog') && class_exists('\app\common\model\base\Systemlog')){ /** * @title: 系统日志 * @desc: 数据表存储日志 * @param {*} $result * @param {*} $remark * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 10:36:18 */ function slog($result = 1,$remark=""){ return \app\common\model\base\Systemlog::log($result,$remark); } } if(!function_exists('ClearNullArray')){ /** * @title: 删除数组中的空字符串元素 * @desc: 注意区别系统函数array_filter * @param {*} $arr * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 10:42:53 */ function ClearNullArray($arr) { $l = array(); foreach ($arr as $k => $v) { if ($v !== "") { if (is_array($v)) { $l[$k] = ClearNullArray($v); } else { $l[$k] = $v; } } } return $l; } } if(!function_exists('GetIP')){ /** * @title: 获取当前请求的IP地址 * @desc: 描述 * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 10:44:20 */ function GetIP() { static $ip = NULL; if ($ip !== NULL) return $ip; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown', $arr); if (false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); } else if (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } else if (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } //IP地址合法验证 $ip = (false !== ip2long($ip)) ? $ip : '0.0.0.0'; return $ip; } } if(!function_exists('GetRealSize')){ /** * @title: 数据转换直观大小 * @desc: 描述 * @param {*} $size * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 10:49:25 */ function GetRealSize($size){ $kb = 1024; // Kilobyte $mb = 1024 * $kb; // Megabyte $gb = 1024 * $mb; // Gigabyte $tb = 1024 * $gb; // Terabyte $res = ""; switch(true){ case $size < $kb: $res = $size.'B';break; case $size < $mb: $res = round($size/$kb,2).'KB';break; case $size < $gb: $res = round($size/$mb,2).'MB';break; case $size < $tb: $res = round($size/$gb,2).'GB';break; default: $res = round($size/$tb,2).'TB';break; } return $res; } } if(!function_exists('GetSizeToBit')){ /** * @title: 讲数据大小转换为直接大小 * @desc: 描述 * @param {*} $filesize * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 11:13:16 */ function GetSizeToBit($filesize){ $filesize=strtolower($filesize); $int_val=intval($filesize); if(strpos($filesize,'kb')!==false){ return $int_val*1024; }elseif(strpos($filesize,'mb')!==false){ return $int_val*1024*1024; }elseif(strpos($filesize,'gb')!==false){ return $int_val*1024*1024*1024; }elseif(strpos($filesize,'tb')!==false){ return $int_val*1024*1024*1024*1024; }elseif(strpos($filesize,'k')!==false){ return $int_val*1024; }elseif(strpos($filesize,'m')!==false){ return $int_val*1024*1024; }elseif(strpos($filesize,'g')!==false){ return $int_val*1024*1024*1024; }elseif(strpos($filesize,'t')!==false){ return $int_val*1024*1024*1024*1024; }else{ return $int_val; } } } if(!function_exists('GetDirSize')){ /** * @title: 获取文件夹大小 * @desc: 描述 * @param {*} $dir * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-13 11:31:03 */ function GetDirSize($dir) { $handle = opendir($dir); $fsize = ''; while (($fname = readdir($handle)) !== false) { if ($fname != '.' && $fname != '..') { if (is_dir("$dir/$fname")) $fsize += GetDirSize("$dir/$fname"); else $fsize += filesize("$dir/$fname"); } } closedir($handle); if (empty($fsize)) $fsize = 0; return $fsize; } } if(!function_exists('AuthCode')){ /** * @title: 文本加密或解密 * @desc: 描述 * @param {string} {string} {} {需要加密或解密的文本} * @param {string} {operation} {} {操作,DECODE=解密,其他的为加密} * @param {string} {key} {} {用于加密或解密的秘钥} * @param {int} {expiry} {} {密文有效期} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-16 14:46:05 */ function AuthCode($string, $operation = 'DECODE', $key = '', $expiry = 0) { // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。 // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方 // 当此值为 0 时,则不产生随机密钥 $ckey_length = 4;// 密匙 $key = md5($key ? $key : "");// 密匙a会参与加解密 $keya = md5(substr($key, 0, 16));// 密匙b会用来做数据完整性验证 $keyb = md5(substr($key, 16, 16));// 密匙c用于变化生成的密文 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';// 参与运算的密匙 $cryptkey = $keya . md5($keya . $keyc); $key_length = strlen($cryptkey); // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); // 产生密匙簿 for ($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上并不会增加密文的强度 for ($j = $i = 0; $i < 256; $i++) { //$j是三个数相加与256取余 $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } // 核心加解密部分 for ($a = $j = $i = 0; $i < $string_length; $i++) { //在上面基础上再加1 然后和256取余 $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256;//$j加$box[$a]的值 再和256取余 $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; // 从密匙簿得出密匙进行异或,再转成字符,加密和解决时($box[($box[$a] + $box[$j]) % 256])的值是不变的。 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if ($operation == 'DECODE') { // 验证数据有效性,请看未加密明文的格式 if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 return $keyc . str_replace('=', '', base64_encode($result)); } } } if(!function_exists('Auto_Charset')){ /** * @title: 文本的字符集转换 * @desc: 描述 * @param {string} {fContents} {} {待转换的文本} * @param {string} {from} {} {文本的原字符集} * @param {string} {to} {} {转换后的字符集} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-16 14:51:15 */ function Auto_Charset($fContents, $from = 'gbk', $to = 'utf-8') { $from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from; $to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to; if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) { // 如果编码相同或者非字符串标量则不转换 return $fContents; } if (is_string($fContents)) { if (function_exists('mb_convert_encoding')) { return mb_convert_encoding($fContents, $to, $from); } elseif (function_exists('iconv')) { return iconv($from, $to, $fContents); } else { return $fContents; } } elseif (is_array($fContents)) { foreach ($fContents as $key => $val) { $_key = Auto_Charset($key, $from, $to); $fContents[$_key] = Auto_Charset($val, $from, $to); if ($key != $_key) unset($fContents[$key]); } return $fContents; } else { return $fContents; } } } if(!function_exists('DelFile')){ /** * @title: 删除非空目录 * @desc: 描述 * @param {string} {dir} {} {目录路径} * @param {boolean} {del_root} {true} {是否删除根目录} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-16 14:55:53 */ function DelFile($dir,$del_root=true) { if ($handle = opendir("$dir")) { while (false !== ($item = readdir($handle))) { if ($item != "." && $item != "..") { if (is_dir($dir.DS.$item)) { DelFile($dir.DS.$item); } else { unlink($dir.DS.$item); } } } closedir($handle); if($del_root){ rmdir($dir); } } } } if(!function_exists('ScandirAll')){ /** * @title: 扫描整个目录下的文件,将扫描结果以数组形式返回 * @desc: 描述 * @param {string} {path} {} {待扫描的目录} * @param {array} {exclude} {} {忽略的文件数组} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-16 15:06:08 */ function ScandirAll(string $path,array $exclude=['.gitignore']) { if(!file_exists($path)) { return []; } $files = scandir($path); $fileItem = []; foreach($files as $v) { $newPath = $path .DS . $v; if(is_dir($newPath) && $v != '.' && $v != '..') { $fileItem = array_merge($fileItem, ScandirAll($newPath)); }else if(is_file($newPath)&& $v!=$exclude){ $fileItem[] = $newPath; } } return $fileItem; } } if(!function_exists('getYmdHis')){ /** * @title: 将秒转换为天时分秒 * @desc: 描述 * @param {*} $second * @return {*} * @author: Rock * @method: POST * @Date: 2022-10-14 15:27:37 */ function getYmdHis($second=0,$format="dHis") { $d = 0; $H = 0; $i = 0; $s = 0; if(false!==strpos($format,'d')){ $d = ($second - $second % 86400) / 86400;//天 $second = $second % 86400; } if(false!==strpos($format,'H')){ $H = ($second - $second % 3600) / 3600;//小时 $second = $second % 3600; } if(false!==strpos($format,'i')){ $i = ($second - $second % 60) / 60;//分钟 } if(false!==strpos($format,'s')){ $s = $second % 60;// 秒 } $str = ''; if(!empty($d)){ $str .= $d.'天'; } if(!empty($H)){ $str .= $H.'小时'; } if(!empty($i)){ $str .= $i.'分钟'; } if(!empty($s)){ $str .= $s.'秒'; } return $str; } } /** * 复制文件夹 * @param $source * @param $dest */ function CopyDir($source, $dest) { if (!file_exists($dest)) mkdir($dest); $handle = opendir($source); while (($item = readdir($handle)) !== false) { if ($item == '.' || $item == '..') continue; $_source = $source . DS . $item; $_dest = $dest .DS . $item; if (is_file($_source)) copy($_source, $_dest); if (is_dir($_source)) CopyDir($_source, $_dest); } closedir($handle); } //获得文件扩展名 function Get_FileExt($file){ return strtolower(pathinfo($file, PATHINFO_EXTENSION)); } //获得URL中的文件名 function Get_FileName($file_path,$is_Ext=true){ $Array=pathinfo($file_path); if($is_Ext==true){ return $Array['basename']; }else{ return $Array['filename']; } } //判断是否是通过手机访问 function IsMobileAccess() { if (isset($_SERVER['HTTP_X_WAP_PROFILE']))//如果有HTTP_X_WAP_PROFILE则一定是移动设备 return TRUE; //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息 if (isset($_SERVER['HTTP_VIA'])) { //找不到为flase,否则为true return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false; } //判断手机发送的客户端标志,兼容性有待提高 if (isset($_SERVER['HTTP_USER_AGENT'])) { $clientkeywords = array('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'); //从HTTP_USER_AGENT中查找手机浏览器的关键字 if (preg_match('/(' . implode('|', $clientkeywords) . ')/i', strtolower($_SERVER['HTTP_USER_AGENT']))) { return TRUE; } } //协议法,因为有可能不准确,放到最后判断 if (isset($_SERVER['HTTP_ACCEPT'])) { //如果只支持wml并且不支持html那一定是移动设备 //如果支持wml和html但是wml在html之前则是移动设备 if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) { return TRUE; } } return FALSE; } // 判断是否通过小程序访问 function IsWxApplet(){ return isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger')!==false; } //radio、checkbox、list字段原数据解析 function UnFieldData($data){ $list=array_filter(explode("\n",$data)); $array=array(); foreach($list as $row){ $fd=explode(':',$row); $array[trim($fd[1])]=trim($fd[0]); } return $array; } //截取指定长度的字符串 utf-8专用 汉字和大写字母长度算1,其它字符长度算0.5 $str 原字符串 $len 截取长度 $etc 省略字符... 截取后的字符串 function ReStrLen($str, $len = 10, $etc = '...') { $restr = ''; $i = 0; $n = 0.0; $strlen = strlen($str);//字符串的字节数 while (($n < $len) and ($i < $strlen)) { $temp_str = substr($str, $i, 1); $ascnum = ord($temp_str); //得到字符串中第$i位字符的ASCII码 //如果ASCII位高与252 if ($ascnum >= 252) { $restr = $restr . substr($str, $i, 6);//根据UTF-8编码规范,将6个连续的字符计为单个字符 $i = $i + 6;//实际Byte计为6 $n++;//字串长度计1 } else if ($ascnum >= 248) { $restr = $restr . substr($str, $i, 5); $i = $i + 5; $n++; } else if ($ascnum >= 240) { $restr = $restr . substr($str, $i, 4); $i = $i + 4; $n++; } else if ($ascnum >= 224) { $restr = $restr . substr($str, $i, 3); $i = $i + 3; $n++; } else if ($ascnum >= 192) { $restr = $restr . substr($str, $i, 2); $i = $i + 2; $n++; } //如果是大写字母 I除外 else if ($ascnum >= 65 and $ascnum <= 90 and $ascnum != 73) { $restr = $restr . substr($str, $i, 1); $i = $i + 1;//实际的Byte数仍计1个 $n++;//但考虑整体美观,大写字母计成一个高位字符 } //%,&,@,m,w 字符按1个字符宽 else if (!(array_search($ascnum, array(37, 38, 64, 109, 119)) === FALSE)) { $restr = $restr . substr($str, $i, 1); $i = $i + 1;//实际的Byte数仍计1个 $n++;//但考虑整体美观,这些字条计成一个高位字符 } //其他情况下,包括小写字母和半角标点符号 else { $restr = $restr . substr($str, $i, 1); $i = $i + 1;//实际的Byte数计1个 $n = $n + 0.5;//其余的小写字母和半角标点等与半个高位字符宽 } } //超过长度时在尾处加上省略号 if ($i < $strlen) { $restr = $restr . $etc; } return $restr; } //快速跳转 function J($url, $msg = "") { if ($msg <> "") { $str = ""; } else { $str = ""; } echo $str; exit(); } //延时跳转 function JTime($url,$time=3){ echo ''; exit(); } //显示信息快速条跳转 function ShowMsg($msg = '', $gourl = '-1') { if ($gourl == '-1'){ echo ''; }else if ($gourl == '0'){ echo ''; }else{ echo ''; } exit(); } //生成一个订单号 function CreateOrderID(){ $date=date('ymd'); $order_pool_head = RUNTIME_PATH.'order'; $order_pool=$order_pool_head.DS.$date.'.cache';//订单池 if(file_exists($order_pool)){ $list=unserialize(file_get_contents($order_pool)); if(count($list)>=1){ $oid=array_pop($list); file_put_contents($order_pool,serialize($list)); }else{ $oid=CreateOrderPool(); } }else{ if(!file_exists($order_pool_head)){ mkdir($order_pool_head); } $fp = @fopen($order_pool, "w"); fclose($fp); $oid=CreateOrderPool(); } return $oid; } //创建一个订单池,并返回一个 function CreateOrderPool($num=10000){ $date=date('ymdHi'); $date_file=date('ymd'); //订单池 $order_pool=RUNTIME_PATH.'order'.DS.$date_file.'.cache'; $list=array(); for($i=1;$i<=$num;$i++){ $list[]=$date.mt_rand(10000,99999); } $list=array_unique($list); $p=array_pop($list); file_put_contents($order_pool,serialize($list)); unset($list); return $p; } //清除地址信息中非正常的字符串 function address_clear($str){ return str_replace(array("市辖区","市辖县","省直辖行政单位"),"",$str); } function Get_Server_Base_Info(){ $l[4]['name']='HTTP_HOST'; $l[4]['title']='主机地址'; $l[4]['value']=$_SERVER['HTTP_HOST']; $l[6]['name']='SERVER_NAME'; $l[6]['title']='网站绑定域名'; $l[6]['value']=$_SERVER['SERVER_NAME']; $l[7]['name']='SERVER_PORT'; $l[7]['title']='网站绑定端口'; $l[7]['value']=$_SERVER['SERVER_PORT']; $l[8]['name']='SERVER_SOFTWARE'; $l[8]['title']='服务器软件'; $l[8]['value']=$_SERVER['SERVER_SOFTWARE']; $l[9]['name']='SERVER_PROTOCOL'; $l[9]['title']='服务器协议'; $l[9]['value']=$_SERVER['SERVER_PROTOCOL']; $l[9]['name']='PHP_VERSION'; $l[9]['title']='PHP 版本'; $l[9]['value']=PHP_VERSION; return $l; } function Get_PHP_Base_Info(){ $l[1]['name']='asp_tags'; $l[1]['title']='ASP标签'; $l[1]['value']=(ini_get('asp_tags')==1?'支持':'不支持'); $l[2]['name']='max_execution_time'; $l[2]['title']='最大执行时间'; $l[2]['value']=ini_get('max_execution_time').'秒'; $l[3]['name']='max_input_time'; $l[3]['title']='最大输入时间'; $l[3]['value']=ini_get('max_input_time').'秒'; $l[4]['name']='memory_limit'; $l[4]['title']='内存使用上限'; $l[4]['value']=ini_get('memory_limit'); $l[5]['name']='display_errors'; $l[5]['title']='是否显示错误'; $l[5]['value']=(ini_get('display_errors')==1?'显示':'不显示'); $l[6]['name']='post_max_size'; $l[6]['title']='POST提交数据大小限止'; $l[6]['value']=ini_get('post_max_size'); $l[7]['name']='upload_max_filesize'; $l[7]['title']='文件上传大小限止'; $l[7]['value']=ini_get('upload_max_filesize'); $l[8]['name']='max_file_uploads'; $l[8]['title']='文件上传数量限止'; $l[8]['value']=ini_get('max_file_uploads'); $l[9]['name']='date.timezone'; $l[9]['title']='系统时间时区'; $l[9]['value']=ini_get('date.timezone'); return $l; } function Get_PHP_Ext_list(){ $ext_list=get_loaded_extensions(); foreach($ext_list as $k=>$v){ $ext_list[$k]=strtolower($v); } $name_list=array( 'Core'=>'PHP核心', 'bcmath'=>'高精度数学运算', 'calendar'=>'日历', 'ctype'=>'字符串体测函数', 'date'=>'日期时间函数', 'filter'=>'过滤器', 'ereg'=>'字符串比对解析', 'ftp'=>'FTP协议', 'hash'=>'HASH算法', 'iconv'=>'字符集转换', 'json'=>'JSON数据支持', 'mcrypt'=>'Mcrypt加密算法', 'SPL'=>'PHP标准库', 'odbc'=>'开放数据库连接', 'pcre'=>'PCRE正则', 'Reflection'=>'反射', 'session'=>'会话', 'standard'=>'PHP标准', 'mysqlnd'=>'MySQL Native 驱动', 'tokenizer'=>'解析器', 'zip'=>'ZIP解压', 'zlib'=>'zlib解压', 'libxml '=>'XML解析', 'dom '=>'DOM 解析器', 'PDO '=>'PDO支持', 'bz2 '=>'bz2解压', 'SimpleXML '=>'简单XML解析', 'openssl '=>'安全套接字', 'gd '=>'GD库', 'mbstring '=>'多字节字符串支持', 'exif '=>'EXIF信息', 'mysql '=>'MYSQL驱动', 'mysqli '=>'MYSQLi驱动', 'pdo_mysql'=>'PDO MYSQL驱动', 'PDO_ODBC'=>'PDO_ODBC驱动', 'PDO_ODBC'=>'PDO_ODBC驱动', 'pdo_sqlite'=>'PDO SQLite 驱动', 'sqlite3'=>'SQLite3驱动', 'sockets'=>'Sockets套接字', 'gmagick'=>'Gmagick图像处理库', 'mhash'=>'MHash离散算法' ); foreach($name_list as $k=>$v){ $setlist[strtolower($k)]=$v; } $ls=array(); $i=1; foreach($name_list as $k=>$v){ if(in_array($k,$ext_list)){ $ls[$i]['name']=$k; $ls[$i]['title']=$v; $ls[$i]['value']="支持"; $i++; } } return $ls; } //配置文件管理-获取 function Get_Config($file, $name) { $file=RUNTIME_PATH.'config'.DS.$file; if (file_exists($file)) { $list = unserialize(file_get_contents($file)); if (isset($list[$name])) { return $list[$name]; } else { return false; } } else { return false; } } //配置文件管理-设置 function Set_Config($file, $name, $value) { $file=RUNTIME_PATH.'config'.DS.$file; if (!file_exists($file)) { file_put_contents($file, serialize(array())); } $list = unserialize(file_get_contents($file)); $new_arr = array($name => $value); $new = array_merge($list, $new_arr); if (file_put_contents($file, serialize($new))) { return true; } else { return false; } } //xml转换成数组 function XmlToArray( $xml ){ return (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); } //数组转换成Xml function ToXml($arr){ $xml = ""; foreach ($arr as $key=>$val){ if (is_numeric($val)){ $xml.="<".$key.">".$val.""; }else{ $xml.="<".$key.">"; } } $xml.=""; return $xml; } //搜索并清理附件(图片)文件 1:单路径 2:多路径 3:编辑器 function ClearDocumentImages($content,$type=1){ if($type==1){ $file=PathDS(ROOT_PATH.$content); @unlink($file); return true; }else if($type==2){ $List=unserialize($content); }else if($type==3){ $preg="# src=\"(.*)\"#iUs"; preg_match_all($preg, $content,$arr); $List=$arr[1]; }else{ return false; } foreach($List as $v){ if(strpos($v,'http') !==0){ @unlink(PathDS(ROOT_PATH.$v)); } } return true; } //本地写入路径 斜线自动根据win、linux平台转换 (主要用于本地文件读写操作) function PathDS($str){ $str=str_replace("\\",DS,$str); return str_replace("/",DS,$str); } //资源路径 斜线自动转换 (主要用于相路径) function PathDS2($str){ return str_replace("\\","/",$str); } //判断是否是微信浏览器 function IsWeixin() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { return true; }else{ return false; } } //获得当前页面的全路径 function GetCurrentUrl(){ $current_url='http://'; if(isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']=='on'){ $current_url='https://'; } // if($_SERVER['SERVER_PORT']!='80'){ // $current_url.=$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI']; // }else{ $current_url.=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // } return $current_url; } //CURL异步将远程链接上的内容(图片或内容)写到本地 function PutFileFromUrlContent($url, $savefile) { set_time_limit ( 0 );// 设置运行时间为无限制 $url = trim ( $url ); $curl = curl_init (); curl_setopt ( $curl, CURLOPT_URL, $url );// 设置你需要抓取的URL curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 设置header curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 $file = curl_exec ( $curl );// 运行cURL,请求网页 curl_close ( $curl );// 关闭URL请求 $write = @fopen ( $savefile, "w" ); // 将文件写入获得的数据 if ($write == false) { return false; } if (fwrite ( $write, $file ) == false) { return false; } if (fclose ( $write ) == false) { return false; } } //CURL POST提交数据 function Post_Curl($data, $url, $second = 30){ try{ $data = is_string($data)?$data:http_build_query($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置超时 curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//严格校验 // curl_setopt($ch, CURLOPT_HEADER, array('Expect:'));//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_POST, TRUE);//post提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $data = curl_exec($ch);//运行curl //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); WLog('Post_Curl_Error',"CURL出错,错误码:$error"."URL:$url"); } }catch(Exception $e){ WLog('Post_Curl_Error',"CURL出错:".$e->getFile().'第'.$e->getLine().'行:'.$e->getMessage()); } } if(!function_exists('Post_Json_Curl')){ function Post_Json_Curl($jsonStr,$url,$second = 30){ try{ $jsonStr = is_string($jsonStr)?$jsonStr:json_encode($jsonStr); $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置超时 curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验 curl_setopt($ch, CURLOPT_HEADER, FALSE);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_POST, TRUE);//post提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=utf-8', 'Content-Length: ' . strlen($jsonStr) ) ); $data = curl_exec($ch);//运行curl //返回结果 if($data){ // $RES = curl_getinfo($ch,CURLINFO_HTTP_BODY); curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); WLog('Post_Json_Curl_Error',"CURL出错,错误码:$error"."URL:$url"); } }catch(Exception $e){ WLog('Post_Json_Curl_Error',"CURL出错:".$e->getFile().'第'.$e->getLine().'行:'.$e->getMessage()); } } } //CURL JSON POST提交数据 function Post_Json($data, $url,$header=[]){ $options = array( 'http' => array_merge(array( 'method' => 'POST', 'header' => 'Content-type:application/json; charset=utf-8', //header 需要设置为 JSON 'content' => $data, 'timeout' => 60 //超时时间 ),$header) ); $context = stream_context_create( $options ); $result = file_get_contents($url, false, $context ); return $result; } /** * 根据经纬度和半径计算出范围 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 * @return Array 范围数组 */ function CalcScope($lat, $lng, $radius) { $degree = (24901*1609)/360.0; $dpmLat = 1/$degree; $radiusLat = $dpmLat*$radius; $minLat = $lat - $radiusLat; // 最小纬度 $maxLat = $lat + $radiusLat; // 最大纬度 $mpdLng = $degree*cos($lat * (pi()/180)); $dpmLng = 1 / $mpdLng; $radiusLng = $dpmLng*$radius; $minLng = $lng - $radiusLng; // 最小经度 $maxLng = $lng + $radiusLng; // 最大经度 /** 返回范围数组 */ $scope = array( 'minLat' => $minLat, 'maxLat' => $maxLat, 'minLng' => $minLng, 'maxLng' => $maxLng ); return $scope; } /** * 验证区域范围(计算一个点是否在一个多边形范围内) * @param array $coordArray 区域 * @param array $point 验证点 * @return bool */ function isPointInPolygon($coordArray, $point) { if(!is_array($coordArray)||!is_array($point)) return false; $maxY = $maxX = 0; $minY = $minX = 9999; foreach ($coordArray as $item){ if($item['lng']>$maxX) $maxX = $item['lng']; if($item['lng'] < $minX) $minX = $item['lng']; if($item['lat']>$maxY) $maxY = $item['lat']; if($item['lat'] < $minY) $minY = $item['lat']; $vertx[] = $item['lng']; $verty[] = $item['lat']; } if ($point['lng'] < $minX || $point['lng'] > $maxX || $point['lat'] < $minY || $point['lat'] > $maxY) { return false; } $c = false; $nvert=count($coordArray); $testx=$point['lng']; $testy=$point['lat']; for ($i = 0, $j = $nvert-1; $i < $nvert; $j = $i++) { if ( ( ($verty[$i]>$testy) != ($verty[$j]>$testy) ) && ($testx < ($vertx[$j]-$vertx[$i]) * ($testy-$verty[$i]) / ($verty[$j]-$verty[$i]) + $vertx[$i]) ) $c = !$c; } return $c; } /** * 获取两个经纬度之间的距离 * @param string $lat1 纬一 * @param String $lng1 经一 * @param String $lat2 纬二 * @param String $lng2 经二 * @return float 返回两点之间的距离 */ function CalcDistance($lat1, $lng1, $lat2, $lng2) { /** 转换数据类型为 double */ $lat1 = doubleval($lat1); $lng1 = doubleval($lng1); $lat2 = doubleval($lat2); $lng2 = doubleval($lng2); /** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */ $theta = $lng1 - $lng2; $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $miles = $dist * 60 * 1.1515; return ($miles * 1.609344); } //移除微信昵称中的emoji字符 function removeEmoji($nickname) { $clean_text = $nickname; // Match Emoticons $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u'; $clean_text = preg_replace($regexEmoticons, '', $clean_text); // Match Miscellaneous Symbols and Pictographs $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u'; $clean_text = preg_replace($regexSymbols, '', $clean_text); // Match Transport And Map Symbols $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u'; $clean_text = preg_replace($regexTransport, '', $clean_text); // Match Miscellaneous Symbols $regexMisc = '/[\x{2600}-\x{26FF}]/u'; $clean_text = preg_replace($regexMisc, '', $clean_text); // Match Dingbats $regexDingbats = '/[\x{2700}-\x{27BF}]/u'; $clean_text = preg_replace($regexDingbats, '', $clean_text); return $clean_text; } //计算周 function get_week($date){ //强制转换日期格式 $date_str=date('Y-m-d',strtotime($date)); //封装成数组 $arr=explode("-", $date_str); //参数赋值-年 $year=$arr[0]; //月,输出2位整型,不够2位右对齐 $month=sprintf('%02d',$arr[1]); //日,输出2位整型,不够2位右对齐 $day=sprintf('%02d',$arr[2]); //时分秒默认赋值为0; $hour = $minute = $second = 0; //转换成时间戳 $strap = mktime($hour,$minute,$second,$month,$day,$year); //获取数字型周几 $number_wk=date("w",$strap); //自定义周数组 $weekArr=array("周日","周一","周二","周三","周四","周五","周六"); //获取数字对应的周 return $weekArr[$number_wk]; } /** * 求两个日期之间相差的天数 * (针对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; } //数组转换成字符串包括key function array2string($array){ $string = []; if($array && is_array($array)){ foreach ($array as $key=> $value){ $string[] = $key.':'.$value; } } return implode(",",$string); } //获取输入流并把JSON转换成数组,主要用于小程序和APP数据传输接收 function get_input_stream(){ $postStr = file_get_contents("php://input"); return json_decode($postStr,true); } /** * 判断当前的时分是否在指定的时间段内 * @param $start 开始时分 eg:10:30 * @param $end 结束时分 eg:15:30 * @author:mzc * @date:2018/8/9 10:46 * @return: bool 1:在范围内,0:没在范围内 */ function checkIsBetweenTime($start,$end){ $date= date('H:i'); $curTime = strtotime($date);//当前时分 $assignTime1 = strtotime($start);//获得指定分钟时间戳,00:00 $assignTime2 = strtotime($end);//获得指定分钟时间戳,01:00 $result = 0; if($curTime>$assignTime1&&$curTime<$assignTime2){ $result = 1; } return $result; } //php模块安装检测 function check_phpext($name){ $ext_list=get_loaded_extensions(); if(in_array($name,$ext_list)){ return true; }else{ return false; } } //检测系统数据库是否安装正常 function CheckDataBase(){ //连接数据库测试 //获得默认数据库配置 $config = config('database'); $mysql_conn=@mysqli_connect($config['hostname'],$config['username'],$config['password'],$config['database']); if(!$mysql_conn){ J('/install','FastPHP数据库连接失败,请重新安装!'); }else{ return true; } } //获得汉字的首字母-一般用于数组汉字排序 function GetFirstChar($str) { if(empty($str)){ return ''; } try{ $temp_str = substr($str, 0, 1); if(ord($temp_str)>127){ $str = substr($str,0,3); }else{ $str = $temp_str; return $str; $fchar = ord($str[0]); if ($fchar >= ord("A") and $fchar <= ord("z")) return strtoupper(chr($fchar)); } $s1 = iconv('UTF-8','gb2312//IGNORE',$str); if(empty($s1)){ return null; } $s2 = iconv('gb2312','UTF-8',$s1); if(empty($s2)){ return null; } }catch(\Exception $e){ halt($str); } $s = $s2 == $str ? $s1 : $str; $asc = ord($s[0]) * 256 + ord($s[1])-65536; if ($asc >= -20319 and $asc <= -20284)return "A"; if ($asc >= -20283 and $asc <= -19776)return "B"; if ($asc >= -19775 and $asc <= -19219)return "C"; if ($asc >= -19218 and $asc <= -18711)return "D"; if ($asc >= -18710 and $asc <= -18527)return "E"; if ($asc >= -18526 and $asc <= -18240)return "F"; if ($asc >= -18239 and $asc <= -17923)return "G"; if ($asc >= -17922 and $asc <= -17418)return "H"; if ($asc >= -17417 and $asc <= -16475)return "J"; if ($asc >= -16474 and $asc <= -16213)return "K"; if ($asc >= -16212 and $asc <= -15641)return "L"; if ($asc >= -15640 and $asc <= -15166)return "M"; if ($asc >= -15165 and $asc <= -14923)return "N"; if ($asc >= -14922 and $asc <= -14915)return "O"; if ($asc >= -14914 and $asc <= -14631)return "P"; if ($asc >= -14630 and $asc <= -14150)return "Q"; if ($asc >= -14149 and $asc <= -14091)return "R"; if ($asc >= -14090 and $asc <= -13319)return "S"; if ($asc >= -13318 and $asc <= -12839)return "T"; if ($asc >= -12838 and $asc <= -12557)return "W"; if ($asc >= -12556 and $asc <= -11848)return "X"; if ($asc >= -11847 and $asc <= -11056)return "Y"; if ($asc >= -11055 and $asc <= -10247)return "Z"; // 百家姓中的生僻字 $rare_arr = array( -3652=>array('word'=>"窦",'first_char'=>'D','all_char'=>'DOU'), -8503=>array('word'=>"奚",'first_char'=>'X','all_char'=>'XI'), -9286=>array('word'=>"酆",'first_char'=>'F','all_char'=>'FENG'), -7761=>array('word'=>"岑",'first_char'=>'C','all_char'=>'CEN'), -5128=>array('word'=>"滕",'first_char'=>'T','all_char'=>'TENG'), -9479=>array('word'=>"邬",'first_char'=>'W','all_char'=>'WU'), -5456=>array('word'=>"臧",'first_char'=>'Z','all_char'=>'ZANG'), -7223=>array('word'=>"闵",'first_char'=>'M','all_char'=>'MIN'), -2877=>array('word'=>"裘",'first_char'=>'Q','all_char'=>'QIU'), -6191=>array('word'=>"缪",'first_char'=>'M','all_char'=>'MIAO'), -5414=>array('word'=>"贲",'first_char'=>'B','all_char'=>'BEN'), -4102=>array('word'=>"嵇",'first_char'=>'J','all_char'=>'JI'), -8969=>array('word'=>"荀",'first_char'=>'X','all_char'=>'XUN'), -4938=>array('word'=>"於",'first_char'=>'Y','all_char'=>'YU'), -9017=>array('word'=>"芮",'first_char'=>'R','all_char'=>'RUI'), -2848=>array('word'=>"羿",'first_char'=>'Y','all_char'=>'YI'), -9477=>array('word'=>"邴",'first_char'=>'B','all_char'=>'BING'), -9485=>array('word'=>"隗",'first_char'=>'K','all_char'=>'WEI'), -6731=>array('word'=>"宓",'first_char'=>'M','all_char'=>'MI'), -9299=>array('word'=>"郗",'first_char'=>'X','all_char'=>'XI'), -5905=>array('word'=>"栾",'first_char'=>'L','all_char'=>'LUAN'), -4393=>array('word'=>"钭",'first_char'=>'T','all_char'=>'TOU'), -9300=>array('word'=>"郜",'first_char'=>'G','all_char'=>'GAO'), -8706=>array('word'=>"蔺",'first_char'=>'L','all_char'=>'LIN'), -3613=>array('word'=>"胥",'first_char'=>'X','all_char'=>'XU'), -8777=>array('word'=>"莘",'first_char'=>'S','all_char'=>'SHEN'), -6708=>array('word'=>"逄",'first_char'=>'P','all_char'=>'PANG'), -9302=>array('word'=>"郦",'first_char'=>'L','all_char'=>'LI'), -5965=>array('word'=>"璩",'first_char'=>'Q','all_char'=>'QU'), -6745=>array('word'=>"濮",'first_char'=>'P','all_char'=>'PU'), -4888=>array('word'=>"扈",'first_char'=>'H','all_char'=>'HU'), -9309=>array('word'=>"郏",'first_char'=>'J','all_char'=>'JIA'), -5428=>array('word'=>"晏",'first_char'=>'Y','all_char'=>'YAN'), -2849=>array('word'=>"暨",'first_char'=>'J','all_char'=>'JI'), -7206=>array('word'=>"阙",'first_char'=>'Q','all_char'=>'QUE'), -4945=>array('word'=>"殳",'first_char'=>'S','all_char'=>'SHU'), -9753=>array('word'=>"夔",'first_char'=>'K','all_char'=>'KUI'), -10041=>array('word'=>"厍",'first_char'=>'S','all_char'=>'SHE'), -5429=>array('word'=>"晁",'first_char'=>'C','all_char'=>'CHAO'), -2396=>array('word'=>"訾",'first_char'=>'Z','all_char'=>'ZI'), -7205=>array('word'=>"阚",'first_char'=>'K','all_char'=>'KAN'), -10049=>array('word'=>"乜",'first_char'=>'N','all_char'=>'NIE'), -10015=>array('word'=>"蒯",'first_char'=>'K','all_char'=>'KUAI'), -3133=>array('word'=>"竺",'first_char'=>'Z','all_char'=>'ZHU'), -6698=>array('word'=>"逯",'first_char'=>'L','all_char'=>'LU'), -9799=>array('word'=>"俟",'first_char'=>'Q','all_char'=>'QI'), -6749=>array('word'=>"澹",'first_char'=>'T','all_char'=>'TAN'), -7220=>array('word'=>"闾",'first_char'=>'L','all_char'=>'LV'), -10047=>array('word'=>"亓",'first_char'=>'Q','all_char'=>'QI'), -10005=>array('word'=>"仉",'first_char'=>'Z','all_char'=>'ZHANG'), -3417=>array('word'=>"颛",'first_char'=>'Z','all_char'=>'ZHUAN'), -6431=>array('word'=>"驷",'first_char'=>'S','all_char'=>'SI'), -7226=>array('word'=>"闫",'first_char'=>'Y','all_char'=>'YAN'), -9293=>array('word'=>"鄢",'first_char'=>'Y','all_char'=>'YAN'), -6205=>array('word'=>"缑",'first_char'=>'G','all_char'=>'GOU'), -9764=>array('word'=>"佘",'first_char'=>'S','all_char'=>'SHE'), -9818=>array('word'=>"佴",'first_char'=>'N','all_char'=>'NAI'), -9509=>array('word'=>"谯",'first_char'=>'Q','all_char'=>'QIAO'), -3122=>array('word'=>"笪",'first_char'=>'D','all_char'=>'DA'), -9823=>array('word'=>"佟",'first_char'=>'T','all_char'=>'TONG'), ); if(array_key_exists($asc,$rare_arr) && $rare_arr[$asc]['first_char']){ return $rare_arr[$asc]['first_char']; } return null; } // 获取一段中文的首字母 function getStrFirstChar($str=""){ if(empty($str)){ return $str; }else{ $result = ""; $i = 0; while($i =224){ $result .= GetFirstChar(substr($str,$i,3)); $i+=3; }else{ $result .= $tmp_str; $i+=1; } } return $result; } } if (!function_exists('collection')) { /** * 数组转换为数据集对象 * @param array $resultSet 数据集数组 * @return \think\model\Collection|\think\Collection */ function collection($resultSet) { $item = current($resultSet); if ($item instanceof Model) { return \think\model\Collection::make($resultSet); } else { return \think\Collection::make($resultSet); } } } //img标签相对图片路径替换服务器绝对路径 type=1 单图片 2:多图片 3:编辑器 function ImageToServer($content,$server_url,$type=1){ if($type==1){ if(0===strpos($content,'http') || (0===strpos($content,'data:') && false!==strpos($content,'base64')))return $content; if(trim($content)==""){ return ''; }else{ return PathDS2($server_url.$content); } }else if($type==2){ if($content==''){ return []; } $imgs=explode(",",$content); $nlst=array(); foreach($imgs as $k=>$img){ if(trim($img)!="" && false===strpos($img,'http') && false === strpos($img,'data:') && false === strpos($img,'base64')){ $nlst[$k]=PathDS2($server_url.$img); } } return !empty($nlst)?$nlst:$imgs; }else{ preg_match_all('/(?<=img.src=").*?(?=")/',$content, $out, PREG_PATTERN_ORDER); //正则匹配img标签的src属性,返回二维数组 if (!empty($out)) { foreach ($out as $v) { foreach ($v as $j) { if(false===strpos($j,'http') && false===strpos($j,'data:') && false === strpos($j,'base64')){ $url = $server_url.$j; $content = str_replace($j, $url,$content); //替换相对路径为绝对路径 } } } } return $content; } } function FieldConverList($data,$fields = []) { //设置系统默认处理规则 $default=array( 'createtime'=>'time', 'updatetime'=>'time', 'deletetime'=>'time', 'posttime'=>'time', 'paytime'=>'time', 'sendtime'=>'time', 'arrivetime'=>'time', 'receivetime'=>'time', 'jointime'=>'time', 'logintime'=>'time', 'prevtime'=>'time', 'picurl'=>'image', 'picurl_pc'=>'image', 'picurl_m'=>'image', 'videourl'=>'image', 'avatar'=>'image', 'picarr'=>'images', 'videoarr'=>'images', 'content'=>'editor', 'desc'=>'editor', ); if(count($fields)>0){ $default = array_merge($default,$fields); } return FieldConver($data,$default); } //数据字段输出预处理方法 function FieldConver(&$data,$fields=[]) { if(empty($data)){ return $data; } if(is_object($data))$data = $data->toArray(); if(is_string($data)){ ImageToServer($data,WEBURL,1); } foreach($data as $k=>&$v){ if(is_object($v)){ $v = $v->toArray(); } if(!is_array($v)){ $type = $fields[$k]??$k; switch($type){ case 'time': if(is_int($v) && $v>10000){ $v = date('Y-m-d H:i:s',$v); }elseif(empty($v)){ $v = "无"; }else{ $v; } break; case 'date': if(is_int($v) && $v>10000){ $v = date('Y-m-d',$v); }elseif(empty($v)){ $v = "无"; }else{ $v; } break; case 'image': $v=ImageToServer($v,WEBURL,1); break; case 'images': $v=ImageToServer($v,WEBURL,2); break; case 'editor': $v=ImageToServer($v,WEBURL,3); break; case 'mobile_hidden': $v=HiddenMobile($v); break; case 'json': $v=json_decode($v,true); break; case 'set': $v=explode(',',$v); break; } }else{ FieldConver($v,$fields); } } return $data; } /** * @title 身份证格式验证 * @desc 说明 * @method GET/POST * @param {*} * @return {*} * @author Rock */ function testIdcard($idcard) { $vcity = [ 11 => '北京', 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江", 31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南", 42 => "湖北", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏", 61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外" ]; //判断是否为空 if(empty($idcard)){ return false; } //检查长度和类型 if(0==preg_match("/^([\d]{15}$)|([\d]{17}[xX\d]$)/",strtoupper($idcard))){ return false; } //校验省份 if(empty($vcity[substr($idcard,0,2)])){ return false; } $birthday = []; //检查生日 if(15==strlen($idcard)){ $preg = "/^[\d]{6}([\d]{2})([\d]{2})([\d]{2})[\d]{3}$/"; preg_match($preg,$idcard,$birthday); $birthday[1] = intval("19".$birthday[1]); }elseif(18==strlen($idcard)){ $preg = "/^[\d]{6}([\d]{4})([\d]{2})([\d]{2})[\d]{3}([0-9]|X)$/"; preg_match($preg,$idcard,$birthday); }else{ return false; } if($birthday[1]<=1900){ return false; } if(intval($birthday[2])<=0 || intval($birthday[2])>12){ return false; } if(intval($birthday[3])<=0 || intval($birthday[3])>31){ return false; } //检查校验位 if(!checkParity($idcard)){ return false; } return true; } /** * @title 15位身份证号码转18位 * @desc 说明 * @param {*} $idcard * @return {*} * @author Rock */ function idcard15to18($idcard) { if(15==strlen($idcard)){ $arrInt = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; $arrCh = ['1','0','X','9','8','7','6','5','4','3','2']; $cardTemp = 0; $idcard = substr($idcard,0,6).'19'.substr($idcard,6,strlen($idcard)-6); $valnum = ""; for($i=0;$i<17;$i++){ $b = intval(substr($idcard,$i,1)); $w = $arrInt[$i]; $cardTemp += $b * $w; } $valnum = $arrCh[$cardTemp % 11]; $idcard.=$arrCh[$cardTemp % 11]; } return $idcard; } /** * @title 检测身份证校验位 * @desc 说明 * @param {*} $idcard * @return {*} * @author Rock */ function checkParity($idcard) { $idcard = idcard15to18($idcard); $len = strlen($idcard); if(18==$len){ $arrInt = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; $arrCh = ['1','0','X','9','8','7','6','5','4','3','2']; $cardTemp = 0; $valnum = ""; for($i=0;$i<17;$i++){ $b = intval(substr($idcard,$i,1)); $w = $arrInt[$i]; $cardTemp += $b * $w; } $valnum = $arrCh[$cardTemp % 11]; return $valnum == substr($idcard,17,1); } return false; } /** * @title: 从身份证号码解析性别 * @desc: * @param {string} {idcard} {} {身份证号码} * @return {int} {} {} {性别,1=男,2=女} * @Author: Rock * @Date: 2021-07-17 09:59:48 * @LastEditTime: Do not edit */ function getSexByIdCard($idcard) { $position = strlen($idcard) == 15 ? -1 : -2; $sexCode = substr($idcard,$position,1); $sex = $sexCode % 2 ===1 ?1 : 2; return $sex;//1=男,2=女 } /** * @title: 从身份证号解析生日 * @desc: * @param {string} {idcard} {} {身份证号码} * @return {string} {} {} {生日,格式Y-m-d} * @Author: Rock * @Date: 2022-01-04 09:41:16 * @LastEditTime: Do not edit */ function getBirthdayByIdCard($idcard) { $birthday = strlen($idcard) == 15?'19'.substr($idcard,6,6):substr($idcard,6,8); return date('Y-m-d',strtotime($birthday)); } /** * @title: 从身份证号解析年龄 * @desc: * @param {string} {idcard} {} {身份证号码} * @return {int} {} {} {年龄} * @Author: Rock * @Date: 2022-01-04 09:42:29 * @LastEditTime: Do not edit */ function getAgeByIdCard($idcard) { $birthday = getBirthdayByIdCard($idcard); $year = date('Y',strtotime($birthday)); $month = date('m',strtotime($birthday)); $day = date('d',strtotime($birthday)); $current_year = date('Y'); $current_month = date('m'); $current_day = date('d'); $age = $current_year - $year; if($month > $current_month || $month == $current_month && $day > $current_day){ $age--; } return $age; } /** * 数组转树 */ function array2tree($array,$pid='pid',$pk='id',$rootId = 0,$child='children') { $reArray = array_column($array,null,$pk); $result = []; foreach($array as $index=>$item){ if($item[$pid] == $rootId){ unset($array[$index]); if(!empty($array)){ $childlist = array2tree($array,$pid,$pk,$item[$pk],$child); if(!empty($childlist)){ $item[$child] = $childlist; } } $result[] = $item; } } return $result; } if(!function_exists('file2base64')){ /** * @title: 文件转base64格式 * @desc: 将文件转换为base64数据 * @param {string} {file} {} {文件绝对路径} * @return {*} * @author: Rock * @method: POST * @Date: 2023-05-12 15:21:27 */ function file2base64($file) { if (!is_file($file)) { return null; } $mimetype = ""; if (!empty($file)) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimetype = finfo_file($finfo, $file); finfo_close($finfo); } if ($fp = fopen($file, "rb", 0)) { $gambar = fread($fp, filesize($file)); fclose($fp); $base64 = base64_encode($gambar); return "data:" . $mimetype . ";base64," . $base64; } else { return null; } } } /** * 压缩文件下载 */ if(!function_exists('zip_down')){ function zip_down($fileArray=[],$filename=''){ if(false===strpos($filename,'.zip')){ $filename.='.zip'; } $pathname = public_path().'zipdown'.DS.date('Ymd'); if(!is_dir($pathname)){ mkdir($pathname,0777,true); } $pathname=$pathname.DS.$filename; if(file_exists($pathname)){ //文件已存在 return WEBURL.DS.'zipdown'.DS.date('Ymd').DS.$filename; } try{ //创建ZIP包 $zip=new \ZipArchive(); //参数1:zip保存路径,参数2:ZIPARCHIVE::CREATE没有即是创建   if($zip->open($pathname,\ZIPARCHIVE::CREATE || \ZipArchive::OVERWRITE)){ foreach($fileArray as $val){ if(is_string($val)){ $zip->addFile($val,basename($val)); }elseif(is_array($val)){ $zip->addFile($val['fullpath'],$val['name']); } } $zip->close(); return WEBURL.DS.'zipdown'.DS.date('Ymd').DS.$filename; }else{ return false; } }catch(Exception $e){ abort(2,$e->getFile().'第'.$e->getLine().'行:'.$e->getMessage()); } } } /** * 获取系统配置 */ if(!function_exists('sysconfig')){ function sysconfig($key="") { $where = []; $where[] = ['status','=',1]; if(!empty($key)){ if(false!==strpos($key,'.')){ $arr = explode('.',$key); $where[] = ['group_code','=',$arr[0]]; $where[] = ['key','=',$arr[1]]; }else{ $where[] = ['group_code','=',$key]; } } $list = Systemconfig::where($where)->select(); if(false!==strpos($key,'.') && $list->isEmpty()){ return null; } $list = FieldConverList($list,['content'=>'json']); foreach($list as &$val){ if(in_array($val['type'],['selects','checkbox'])){ $val['value'] = explode(',',$val['value']); }elseif(in_array($val['type'],['file','image'])){ $val['value'] = ImageToServer($val['value'],WEBURL,1); }elseif(in_array($val['type'],['files','images'])){ $val['value'] = ImageToServer($val['value'],WEBURL,2); }elseif($val['type']=='datetimerange'){ if(!empty($val['value'])){ $value = json_decode($val['value'],true); $tmp = [$value['start'],$value['end']]; $val['value'] = $tmp; } }elseif($val['type']=='json'){ if(!empty($val['value'])){ $val['value'] = json_decode($val['value'],true); }else{ $val['value'] = []; if(!empty($val['content'])){ $tmp = []; foreach($val['content'] as $content){ $tmp[$content['key']] = ''; } $val['value'][] = $tmp; } } }elseif($val['type']=='number'){ $val['value'] = 0 + intval($val['value']); } } $result = array_column($list,'value','key'); return count($result)==1?end($result):$result; } } /** * 内部发送ws消息 */ if(!function_exists('wssend')){ function wssend($uids,$action,$data){ $weburl = "http://127.0.0.1:81/index.php/index/hello"; $param = [ 'uids' => $uids, 'action' => $action, 'data' => $data ]; $res = Post_Curl($param,$weburl); return json_decode($res,true); } } /** * 二维数组(Double_Dimensional_Array)指定字段排序 */ if(!function_exists('DDA_sort')){ function DDA_sort($array=[],$pk='',$sort_value='',$order='ASC'){ if($array==[]){ return []; } $trans = []; foreach ($array as $v){ $trans[$v[$pk]] = $v[$sort_value]; } if($order=='ASC'){ asort($trans); }else{ arsort($trans); } $res = []; foreach ($trans as $k=>$v){ foreach ($array as $jv){ if($k==$jv[$pk]){ $res[] = $jv; } } } return $res; } } if(!function_exists('isCarLicense')){ function isCarLicense($license) { if (empty($license)) { return false; } $license = trim(str_replace(['-',' ',' ',"/","\n","\r","(",")","(",")"],'',$license)); # 匹配民用车牌和使馆车牌 # 判断标准 # 1,第一位为汉字省份缩写 # 2,第二位为大写字母城市编码 # 3,后面是5位仅含字母和数字的组合 $regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新使]{1}[A-Z]{1}[0-9a-zA-Z]{4,7}$/u"; preg_match($regular, $license, $match); if (isset($match[0])) { return $match[0]; } #匹配特种车牌(挂,警,学,领,港,澳,黄) $regular = '/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[0-9a-zA-Z]{4,7}[挂警学领港澳黄]{1}$/u'; preg_match($regular, $license, $match); if (isset($match[0])) { return $match[0]; } #匹配武警车牌 $regular = '/^WJ[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]?[0-9a-zA-Z]{4,7}$/ui'; preg_match($regular, $license, $match); if (isset($match[0])) { return $match[0]; } #匹配军牌 $regular = "/[A-Z]{2}[0-9]{5}$/"; preg_match($regular, $license, $match); if (isset($match[0])) { return $match[0]; } #匹配新能源车辆6位车牌 #小型新能源车 $regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[DF]{1}[0-9a-zA-Z]{4,7}$/u"; preg_match($regular, $license, $match); if (isset($match[0])) { return $match[0]; } #大型新能源车 $regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[0-9a-zA-Z]{4,7}[DF]{1}$/u"; preg_match($regular, $license, $match); if (isset($match[0])) { return $match[0]; } return false; } } if(!function_exists('success')) { /** * @title:正确值输出 * @param array $data * @param int $totalCount * @param string $msg * @param int $code * @return mixed */ function success($data = [], $totalCount = null, $msg = '获取成功', $code = 1) { $ret = ['code'=>$code, 'msg'=>$msg, 'data'=>$data]; if($totalCount !== null){ $ret['totalCount'] = $totalCount; } return json($ret); } } if(!function_exists('message')) { /** * @title:消息输出 * @param string $msg * @param int $code * @return mixed */ function message($msg = '保存成功', $code = 1) { return json(['code'=>$code, 'msg'=>$msg]); } } if(!function_exists('error')) { /** * @title:错误值输出 * @param string $msg * @param int $code */ function error($msg = '操作失败', $code = 2) { json(['code'=>$code, 'msg'=>$msg])->send(); exit; } } if(!function_exists('requestLock')) { /** * @title:简易访问锁 * @param $key {锁名} * @param int $expire {延时} * @return bool */ function requestLock($key, $expire=null) { $redis = Cache::store('redis')->handler(); if($expire == null){ $redis->del($key); return true; }elseif($redis->setNx($key,1) == 1){ $redis->expire($key, $expire); return true; }else{ return false; } } }