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;
    }

  

posted @ 2021-08-11 11:28  叫我亚庆  阅读(102)  评论(0)    收藏  举报