php常用函数(遇到就更新)
//某一键名的值不能重复,删除重复项 function assoc_unique($arr, $key) { $tmp_arr = array(); foreach ($arr as $k => $v) { if (in_array($v[$key], $tmp_arr)) {//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true unset($arr[$k]); } else { $tmp_arr[] = $v[$key]; } } sort($arr); //sort函数对数组进行排序 return $arr; }
/** * 二维数组按指定字段分组 * @param $arr * @param $key * @return array */ function array_group_by($arr, $key) { $grouped = []; foreach ($arr as $value) { $grouped[$value[$key]][] = $value; } if (func_num_args() > 2) { $args = func_get_args(); foreach ($grouped as $key => $value) { $parms = array_merge([$value], array_slice($args, 2, func_num_args())); $grouped[$key] = call_user_func_array('array_group_by', $parms); } } return $grouped; }
//内部的一维数组不能完全相同,而删除重复项 function array_unique_fb($array2D) { foreach ($array2D as $v) { $v = join(",", $v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串 $temp[] = $v; } $temp = array_unique($temp);//去掉重复的字符串,也就是重复的一维数组 foreach ($temp as $k => $v) { $temp[$k] = explode(",", $v);//再将拆开的数组重新组装 } return $temp; }
//判断二维数组红是否含有某个值 function deep_in_array($value, $array) { foreach($array as $item) { if(!is_array($item)) { if ($item == $value) { return true; } else { continue; } } if(in_array($value, $item)) { return true; } else if(deep_in_array($value, $item)) { return true; } } return false; }
/* * stdClass Object转array * @param Array * */ function object_array($array) { if (is_object($array)) { $array = (array)$array; } if (is_array($array)) { foreach ($array as $key => $value) { $array[$key] = object_array($value); } } return $array; }
/** * 求两个日期之间相差的天数 * (针对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; }
/** * 验证手机号 * 13********* */ function phone_right ($phone) { return preg_match('/(?:^1[3456789]|^9[28])\d{9}$/',$phone); }
//加密函数 function lock_this($txt,$key='haneo'){ $txt = $txt.$key; $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $nh = rand(0,64); $ch = $chars[$nh]; $mdKey = md5($key.$ch); $mdKey = substr($mdKey,$nh%8, $nh%8+7); $txt = base64_encode($txt); $tmp = ''; $i=0;$j=0;$k = 0; for ($i=0; $i<strlen($txt); $i++) { $k = $k == strlen($mdKey) ? 0 : $k; $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64; $tmp .= $chars[$j]; } return urlencode(base64_encode($ch.$tmp)); } //解密函数 function unlock_this($txt,$key='haneo'){ $txt = base64_decode(urldecode($txt)); $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $ch = $txt[0]; $nh = strpos($chars,$ch); $mdKey = md5($key.$ch); $mdKey = substr($mdKey,$nh%8, $nh%8+7); $txt = substr($txt,1); $tmp = ''; $i=0;$j=0; $k = 0; for ($i=0; $i<strlen($txt); $i++) { $k = $k == strlen($mdKey) ? 0 : $k; $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]); while ($j<0) $j+=64; $tmp .= $chars[$j]; } return trim(base64_decode($tmp),$key); }
// 自然周列表 function GetWeekList($year,$weekcurrent,$tenW_ago) { if ($year%4==0 && ($year%100!=0 || $year%400==0)) { $days=366; } else { $days=365; } $weeks=substr($days/7,0,2);//计算一年有多少个星期 $weeklist=array(); $wc=$tenW_ago; //从第几周开始往后数 for($w=0;$w<$weekcurrent;$w++) { $WeekDate=GetWeekDate($year,$wc,'0'); $startime=date("Y-m-d",$WeekDate[0]); $endtime=date("Y-m-d",$WeekDate[1]); $weeklist[$w]["id"]=$wc; $weeklist[$w]["name"]=$year." 年, 第 ".$wc." 周 ($startime - $endtime)"; $weeklist[$w]["startime"]=$startime; $weeklist[$w]["endtime"]=$endtime; $weeklist[$w]["week"]=$startime.'-'.$endtime; $wc++; } return $weeklist; }
//////计算一周的开始结束时间///////// function GetWeekDate($year,$week,$startcount) { $timestamp = mktime(0,0,0,1,1,$year); $dayofweek = date("w",$timestamp); $distance = ($week-1)*7-$dayofweek+1+$startcount; $passed_seconds = $distance * 86400; $timestamp += $passed_seconds; $first_date_of_week = $timestamp; //date("Ymd",$timestamp); $distance = 7; $timestamp += $distance * 86400; $last_date_of_week = $timestamp; //date("Ymd",$timestamp); $startime=$first_date_of_week; $endtime=$last_date_of_week; $WeekDate=array($startime,$endtime); return $WeekDate; }
/** * 计算出两个日期之间的月份区间 * @author Eric * @param [type] $start_date [开始日期,如2014-03] * @param [type] $end_date [结束日期,如2015-12] * @param string $explode [年份和月份之间分隔符,此例为 - ] * @param boolean $addOne [算取完之后最后是否加一月,用于算取时间戳用] * @return [type] [返回是两个月份之间所有月份字符串] */ function dateMonthsSections($start_date,$end_date,$explode='-',$addOne=false){ $data = dateMonths($start_date,$end_date,$explode,$addOne); $length = sizeof($data); $res = array(); foreach ($data as $key => $value) { if($key < ($length-1)){ $date1 = $value; $date2 = $data[$key + 1]; $res[$key]["startime"] = $date1; $res[$key]["endtime"] = $date2; } } return $res; } /** * 计算出两个日期之间的月份 * @author Eric * @param [type] $start_date [开始日期,如2014-03] * @param [type] $end_date [结束日期,如2015-12] * @param string $explode [年份和月份之间分隔符,此例为 - ] * @param boolean $addOne [算取完之后最后是否加一月,用于算取时间戳用] * @return [type] [返回是两个月份之间所有月份字符串] */ function dateMonths($start_date,$end_date,$explode='-',$addOne=false){ //判断两个时间是不是需要调换顺序 $start_int = strtotime($start_date); $end_int = strtotime($end_date); if($start_int > $end_int){ $tmp = $start_date; $start_date = $end_date; $end_date = $tmp; } //结束时间月份+1,如果是13则为新年的一月份 $start_arr = explode($explode,$start_date); $start_year = intval($start_arr[0]); $start_month = intval($start_arr[1]); $end_arr = explode($explode,$end_date); $end_year = intval($end_arr[0]); $end_month = intval($end_arr[1]); $data = array(); $data[] = $start_date; $tmp_month = $start_month; $tmp_year = $start_year; //如果起止不相等,一直循环 while (!(($tmp_month == $end_month) && ($tmp_year == $end_year))) { $tmp_month ++; //超过十二月份,到新年的一月份 if($tmp_month > 12){ $tmp_month = 1; $tmp_year++; } $data[] = $tmp_year.$explode.str_pad($tmp_month,2,'0',STR_PAD_LEFT); } if($addOne == true){ $tmp_month ++; //超过十二月份,到新年的一月份 if($tmp_month > 12){ $tmp_month = 1; $tmp_year++; } $data[] = $tmp_year.$explode.str_pad($tmp_month,2,'0',STR_PAD_LEFT); } return $data; }
//当前13位时间戳 function getMicrotimes() { list($t1,$t2) = explode(' ',microtime()); return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000); }
//判断HTTPS/HTTP function getHtpps() { return ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https' : 'http'; }
//抽奖 function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } unset ($proArr); return $result; } //使用 public function luck_draw() { $prize_arr = array( '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1), '1' => array('id'=>2,'prize'=>'数码相机','v'=>5), '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10), '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12), '4' => array('id'=>5,'prize'=>'10Q币','v'=>22), '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50), ); foreach ($prize_arr as $key => $val) { $arr[$val['id']] = $val['v']; } $rid = get_rand($arr); //根据概率获取奖项id $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项 unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项 shuffle($prize_arr); //打乱数组顺序 for($i=0;$i<count($prize_arr);$i++){ $pr[] = $prize_arr[$i]['prize']; } $res['no'] = $pr; echo json_encode($res); }
// ASCII 排序 function asc_sort($params = array()) { if (!empty($params)) { $p = ksort($params); if ($p) { $str = ''; foreach ($params as $k => $val) { $str .= $k . '=' . $val . '&'; } $strs = rtrim($str, '&'); return $strs; } } return false; }
/** * 编辑器中的图片 添加域名 * @param string $content 要替换的内容 * @param string $strUrl 内容中图片要加的域名 * @return string * @eg */ function replacePicUrl($content = null, $strUrl = null) { if ($strUrl) { //提取图片路径的src的正则表达式 并把结果存入$matches中 // preg_match_all("/]+>/isU",$content,$matches); preg_match_all("/(src)=(\"[^\"]*\")/i", $content, $matches); // '/(id|alt|title|src)=("[^"]*")/i' $img = ""; if (!empty($matches)) { //注意,上面的正则表达式说明src的值是放在数组的第三个中 $img = $matches[2]; } else { $img = ""; } if (!empty($img)) { $patterns = array(); $replacements = array(); foreach ($img as $imgItem) { // $final_imgUrl = $strUrl.$imgItem; // if(!filter_var($imgItem, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)){ // $final_imgUrl = $strUrl.trim($imgItem,'"'); // }else{ // $final_imgUrl = $imgItem; // } $imgItem = trim($imgItem, '"'); if (check_url($imgItem)) { $final_imgUrl = $imgItem; } else { $final_imgUrl = $strUrl . $imgItem; } $replacements[] = $final_imgUrl; $img_new = "/" . preg_replace("/\//i", "\/", $imgItem) . "/"; $patterns[] = $img_new; } //让数组按照key来排序 ksort($patterns); ksort($replacements); //替换内容 $vote_content = preg_replace($patterns, $replacements, $content); return $vote_content; } else { return $content; } } else { return $content; } }
//检测url是否带HTTP function check_url($C_url) { $str = "/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/"; if (!preg_match($str, $C_url)) { return false; } else { return true; } }
//接受参数写入文件 public function dump_code(){ $file = "result.txt"; $f = fopen($file,"a"); fwrite($f,"----------------------$this->cmd---------------------------"."\n"); fwrite($f,"-----imei-----"."\n".$this->imei."\n"); fwrite($f,"-----cmd-----"."\n".$this->cmd."\n"); fwrite($f,"-----data-----"."\n"); ob_start(); print_r(json_decode(htmlspecialchars_decode($this->data))); $result = ob_get_clean(); fwrite($f,"$result"."\n"); fwrite($f,"-----time-----"."\n".date("Y-m-d H:i:s")."\n\n\n\n"); fclose($f); }
/* *2.获取某个会员的无限下级方法 非递归方法 *$members是所有会员数据表,$mid是用户的id */ function GetTeamMember($members, $mid) { $Teams=array();//最终结果 $mids=array($mid);//第一次执行时候的用户id do { $othermids=array(); $state=false; foreach ($mids as $valueone) { foreach ($members as $key => $valuetwo) { if($valuetwo['pid']==$valueone){ $Teams[]=$valuetwo['dir_id'];//找到我的下级立即添加到最终结果中 $othermids[]=$valuetwo['dir_id'];//将我的下级id保存起来用来下轮循环他的下级 array_splice($members,$key,1);//从所有会员中删除他 $state=true; } } } $mids=$othermids;//foreach中找到的我的下级集合,用来下次循环 } while ($state==true); return $Teams; }
//转化为 时, 分,秒 03:21:40 function format_time($t,$f=':') // t = seconds, f = separator { return sprintf("%02d%s%02d%s%02d", floor($t/3600), $f, ($t/60)%60, $f, $t%60); }
/** * 时间 H:i:s 转 s * @User yaokai * @param $his * @return float|int */ function HisToS($his) { $str = explode(':', $his); $len = count($str); if ($len == 3) { $time = $str[0] * 3600 + $str[1] * 60 + $str[2]; } elseif ($len == 2) { $time = $str[0] * 60 + $str[1]; } elseif ($len == 1) { $time = $str[0]; } else { $time = 0; } return $time; }
// 00:59:20 转为 时 分 秒 public function ftime($s) { $time = explode(':', $s); $time['0'] == '00' ? $h = 0 : $h = $time['0']; $time['1'] == '00' ? $m = 0 : $m = $time['1']; $time['2'] == '00' ? $s = 0 : $s = $time['2']; $ftime = ( empty($h) ? ( empty($m) ? $s .'秒' : ( empty($s) ? $m . '分' : $m . '分' . $s .'秒' ) ) :( empty($m) && empty($s) ? $h .'小时' : ( empty($m) ? $h . '时' . $s . '秒' : ( empty($s) ? $h . '小时' . $m . '分' : $h . '小时' . $m . '分' .$s . '秒' ) ) ) ); return $ftime; }
/** * 可用天数 * @param $start_time 开始时间 * @param $endtime 结束时间 * @param $week_study_day 一周的天数 (0,1,2,3,4,5,6) * 0代表周日 */ public function studyDayNum($start_time, $end_time, $week_study_day) { $s = datetime($start_time); $e = $end_time; $date_arr = $this->getDateFromRange($s, $e); $ky_day = []; $study_day_arr = explode(',', $week_study_day); sort($study_day_arr); foreach ($date_arr as $v) { $week_day = $this->get_week($v); if (in_array($week_day, $study_day_arr)) { $ky_day[] = $v; } } return ['ky_day' => $ky_day, 'count' => count($ky_day)]; }
/** * 获取一个月的第一天和最后一天 * Method mFristAndLast * Author Sunny * CreateDay:2020/8/5 0005 * CreateTime:15:25 * @param string $y * @param string $m * @return array 返回时间戳 */ public function mFristAndLast($y = "", $m = "") { if ($y == "") $y = date("Y"); if ($m == "") $m = date("m"); $m = sprintf("%02d", intval($m)); $y = str_pad(intval($y), 4, "0", STR_PAD_RIGHT); $m > 12 || $m < 1 ? $m = 1 : $m = $m; $firstday = strtotime($y . $m . "01000000"); $firstdaystr = date("Y-m-01", $firstday); $lastday = strtotime(date('Y-m-d 23:59:59', strtotime("$firstdaystr +1 month -1 day"))); return array( "firstday" => $firstday, "lastday" => $lastday ); }
//根据日期判断日期是星期几 public 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("0", "1", "2", "3", "4", "5", "6"); //获取数字对应的星期 return $weekArr[$number_wk]; }
/** * 获取最近七天所有日期 * $time 指定最近的一天的时间 */ public function get_weeks($time = '', $format = 'Y-m-d') { $time = $time != '' ? $time : time(); //组合数据 $date = []; for ($i = 1; $i <= 7; $i++) { $date[$i] = date($format, strtotime('+' . $i - 7 . ' days', $time)); } return $date; }
/** * 获取指定日期内所有的天 * @param Date $startdate 开始日期 * @param Date $enddate 结束日期 * @return Array */ public function getDateFromRangeToDay($startdate, $enddate) { // $stimestamp = strtotime($startdate); // $etimestamp = strtotime($enddate); $stimestamp = $startdate; $etimestamp = $enddate; // 计算日期段内有多少天 $days = ($etimestamp - $stimestamp) / 86400; // 保存每天日期 $date = array(); for ($i = 0; $i < $days; $i++) { $date[] = date('d', $stimestamp + (86400 * $i)); } return $date; }
//数组按照时间排序 $ar = []; $last_names = array_column($ar,'add_time'); array_multisort($last_names,SORT_ASC,$ar);
//号码隐藏 **** function hidtel($phone){ $IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i',$phone); //固定电话 if($IsWhat == 1){ return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$1****$2',$phone); }else{ return preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone); } }
//去除文本中base64图片 src非第一元素, 前加 [^>]* $content = preg_replace('#<img src="data:image/[^>]*/?>#i', '', $content); //文本中图片加上链接 $content = preg_replace('#(<img [^>]*src=")([^>"]+"[^>]*/?>)#i', '$1http://abc.com$2', $content);
/** * 检测是否使用手机访问 * @access public * @return bool */ function isMobile() { if ($_SERVER['SERVER_NAME'] == 'm.rongyuejiaoyu.com') return true; if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) { return true; } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) { return true; } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { return true; } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) { return true; } else { return false; } }
// ascll排序 function ascll($params = array()) { if (!empty($params)) { $p = ksort($params); if ($p) { $str = ''; foreach ($params as $k => $val) { $str .= $k . '=' . $val . '&'; } $strs = rtrim($str, '&'); return $strs; } } }
/** * 首字母头像 * @param $text * @return string */ function letter_avatar($text) { $total = unpack('L', hash('adler32', $text, true))[1]; $hue = $total % 360; list($r, $g, $b) = hsv2rgb($hue / 360, 0.3, 0.9); $bg = "rgb({$r},{$g},{$b})"; $color = "#ffffff"; $first = mb_strtoupper(mb_substr($text, 0, 1)); $src = base64_encode('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="' . $bg . '" x="0" y="0" width="100" height="100"></rect><text x="50" y="50" font-size="50" text-copy="fast" fill="' . $color . '" text-anchor="middle" text-rights="admin" dominant-baseline="central">' . $first . '</text></svg>'); $value = 'data:image/svg+xml;base64,' . $src; return $value; }
// 获取远程文件大小函数 function remote_filesize($url, $user = "", $pw = "") { ob_start(); $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); if(!empty($user) && !empty($pw)) { $headers = array('Authorization: Basic ' . base64_encode("$user:$pw")); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $ok = curl_exec($ch); curl_close($ch); $head = ob_get_contents(); ob_end_clean(); $regex = '/Content-Length:\s([0-9].+?)\s/'; $count = preg_match($regex, $head, $matches); return isset($matches[1]) ? $matches[1] . " 字节" : "unknown"; } /** * 将字节转换为可读文本 * @param int $size 大小 * @param string $delimiter 分隔符 * @return string */ function format_bytes($size, $delimiter = '') { $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); for ($i = 0; $size >= 1024 && $i < 6; $i++) $size /= 1024; return round($size, 2) . $delimiter . $units[$i]; }
/** * [alphaID 加密 解密算法] * @param [type] $in [需要加/解密的值] * @param boolean $to_num [加密false ,解密true] * @param boolean $pad_up [加密位数] * @param [type] $passKey [key] * @return [type] [string] * @example [alphaID(123123, false, 8); en] * @example [alphaID(daxcaaab, true, 8); de] * */ function alphaID($in, $to_num = false, $pad_up = 8, $passKey = null) { // $key = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // $i = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $key = 'abcdefghijklmnopqrstuvwxyz0123456789'; $i = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'); if ($passKey !== null) { $len = strlen($key); $passhash = hash('sha256',$passKey); $passhash = (strlen($passhash) < $len) ? hash('sha512',$passKey) : $passhash; for ($n=0; $n < $len; $n++) { $p[] = substr($passhash, $n ,1); } array_multisort($p, SORT_DESC, $i); $key = implode($i); } $base = strlen($key); if ($to_num) { $in = strrev($in); $out = 0; $len = strlen($in) - 1; for ($t = 0; $t <= $len; $t++) { $bcpow = bcpow($base, $len - $t); $out = $out + strpos($key, substr($in, $t, 1)) * $bcpow; } if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $out -= pow($base, $pad_up); } } } else { // Digital number -->> alphabet letter code if (is_numeric($pad_up)) { $pad_up--; if ($pad_up > 0) { $in += pow($base, $pad_up); } } $out = ""; for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) { $a = floor($in / bcpow($base, $t)); $out = $out . substr($key, $a, 1); $in = $in - ($a * bcpow($base, $t)); } $out = strrev($out); // reverse } return $out; }
if (!function_exists('base64_upload')) { /** * base64 上传文件 * * @param $base64 * @return array */ function base64_upload($base64) { $mk_dirs = function ($dir, $mode = 0777) use (&$mk_dirs) { if (is_dir($dir) || (@mkdir($dir, $mode) && chmod($dir, $mode))) return TRUE; if (!$mk_dirs(dirname($dir), $mode)) return FALSE; return @mkdir($dir, $mode); }; $up_dir = ROOT_PATH . '/public/uploads/' . date('Ymd') . '/'; if (!file_exists($up_dir)) { $mk_dirs($up_dir, 0777); } if (!preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64, $result)) { return ['msg' => '文件错误', 'code' => 400]; } $type = $result[2]; if (!in_array($type, ['pjpeg', 'jpeg', 'jpg', 'gif', 'bmp', 'png'])) { return ['msg' => '图片上传类型错误', 'code' => 400]; } $name = now_date('Hisu') . rand(1000, 9999) . '.' . $result[2]; if (!file_put_contents($up_dir . $name, base64_decode(str_replace($result[1], '', $base64)))) { return ['msg' => '图片上传失败', 'code' => 400]; } return ['code' => 200, 'data' => ['name' => $name, 'path' => $up_dir]]; } }
if (!function_exists('ali_oss_upload_file')) { /** * 上传文件到阿里oss * @param string $field * @param string $upload_path * @return array * @throws OssException */ function ali_oss_upload_file($field = 'file', $upload_path = 'uploads') { $filePaths = []; $objects = []; $retrun = function ($code, $msg = '', $data = []) { return ['code' => $code, 'msg' => $msg, 'data' => $data]; }; $files = request()->file($field); if (is_array($files)) { $file = $files; } else { if ($files == NULL) { $file = $files; } else { $file[] = $files; } } if (empty($file)) { $image = request()->post($field.'/a'); if (empty($image)) { return $retrun('200', '未获取到需要上传的文件'); } $filePaths = []; foreach ($image as $im){ $res = base64_upload($im); if ($res['code'] != 200) { return $res; } $filePaths[] = $res['data']['path'] . $res['data']['name']; $objects[] = implode('/', [$upload_path, date('Ymd'), $res['data']['name']]); } } else { $upload = config('upload'); if (is_array($file)) { foreach ($file as $_file) { preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches); $type = strtolower($matches[2]); $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3]; $size = (int)$upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0); $fileInfo = $_file->getInfo(); $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION)); $suffix = $suffix ? $suffix : 'file'; $mimetypeArr = explode(',', strtolower($upload['mimetype'])); $typeArr = explode('/', $fileInfo['type']); if ($upload['mimetype'] !== '*' && ( !in_array($suffix, $mimetypeArr) || (stripos($typeArr[0] . '/', $upload['mimetype']) !== FALSE && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr))) ) ) { return $retrun(400, '不支持的文件类型'); } if ($fileInfo['size'] > $size) { return $retrun(400, '文件超标'); } $objects[] = implode('/', [$upload_path, date('Ymd'), now_date('His') . rand(10, 99999) . '.' . $suffix,]); $filePaths[] = $fileInfo['tmp_name']; } } } $ossClient = new OssClient(config('ali_oss.access_key_id'), config('ali_oss.access_key_secret'), config('ali_oss.endpoint')); foreach ($objects as $key => $object) { try { $ossClient->uploadFile(config('ali_oss.bucket'), $object, $filePaths[$key]); } catch (OssException $e) { return $retrun(400, $e->getMessage()); }; } $domain = config('ali_oss.domain'); $objects = array_map(function ($v) use ($domain) { return $domain . $v; }, $objects); return $retrun(200, '成功', [ 'urls' => count($objects) > 1 ? $objects : $objects[0], ]); } }
/** * 二维数组根据某个字段排序 * @param array $array 要排序的数组 * @param string $keys 要排序的键字段 * @param string $sort 排序类型 SORT_ASC SORT_DESC * @return array 排序后的数组 */ function arraySort($array, $keys, $sort = SORT_DESC) { $keysValue = []; foreach ($array as $k => $v) { $keysValue[$k] = $v[$keys]; } array_multisort($keysValue, $sort, $array); return $array; }
/** * 拼手气红包 * @param $money 金额 * @param $count 数量 * @return array * @throws Exception * @author 51924 * @date 2022-09-19 14:06 */ function redAlgorithm($money, $count) { // 参数校验 if ($count * 0.01 > $money) { throw new \Exception("单个红包不能低于0.01元"); } // 存放随机红包 $redpack = []; // 未分配的金额 $surplus = $money; for ($i = 1; $i <= $count; $i++) { // 安全金额 $safeMoney = $surplus - ($count - $i) * 0.01; // 平均金额 $avg = $i == $count ? $safeMoney : bcdiv($safeMoney, ($count - $i), 2); // 随机红包 $rand = $avg > 0.01 ? mt_rand(1, $avg * 100) / 100 : 0.01; // 剩余红包 $surplus = bcsub($surplus, $rand, 2); $redpack[] = $rand; } // 平分剩余红包 $avg = bcdiv($surplus, $count, 2); for ($n = 0; $n < count($redpack); $n++) { $redpack[$n] = bcadd($redpack[$n], $avg, 2); $surplus = bcsub($surplus, $avg, 2); } // 如果还有红包没有分配完时继续分配 if ($surplus > 0) { // 随机抽取分配好的红包,将剩余金额分配进去 $keys = array_rand($redpack, $surplus * 100); // array_rand 第二个参数为 1 时返回的是下标而不是数组 $keys = is_array($keys) ? $keys : [$keys]; foreach ($keys as $key) { $redpack[$key] = bcadd($redpack[$key], 0.01, 2); $surplus = bcsub($surplus, 0.01, 2); } } // 红包分配结果 return $redpack; }