//某一键名的值不能重复,删除重复项
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;
}