' . print_r($content, true); $is_die && die(); } /** * 隐藏敏感字符 * @param $value * @return string */ function substr_cut($value) { $strlen = mb_strlen($value, 'utf-8'); if ($strlen <= 1) return $value; $firstStr = mb_substr($value, 0, 1, 'utf-8'); $lastStr = mb_substr($value, -1, 1, 'utf-8'); return $strlen == 2 ? $firstStr . str_repeat('*', $strlen - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr; } /** * 获取当前系统版本号 * @return mixed|null * @throws Exception */ function get_version() { try { $file = root_path() . '/version.json'; $version = json_decode(file_get_contents($file), true); return $version['version']; } catch (\Exception $e) { return ''; } } /** * 驼峰命名转下划线命名 * @param $str * @return string */ function toUnderScore($str) { $dstr = preg_replace_callback('/([A-Z]+)/', function ($matchs) { return '_' . strtolower($matchs[0]); }, $str); return trim(preg_replace('/_{2,}/', '_', $dstr), '_'); } /** * 生成密码hash值 * @param $password * @return string */ function salt_hash($password) { return md5(md5($password) . 'jjjshop_salt_2020'); } /** * curl请求指定url (post) * @param $url * @param array $data * @return mixed */ function curlPost($url, $data = []) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); curl_close($ch); return $result; } /** * 多维数组合并 * @param $array1 * @param $array2 * @return array */ function array_merge_multiple($array1, $array2) { $merge = $array1 + $array2; $data = []; foreach ($merge as $key => $val) { if ( isset($array1[$key]) && is_array($array1[$key]) && isset($array2[$key]) && is_array($array2[$key]) ) { $data[$key] = array_merge_multiple($array1[$key], $array2[$key]); } else { $data[$key] = isset($array2[$key]) ? $array2[$key] : $array1[$key]; } } return $data; } /** * 二维数组排序 * @param $arr * @param $keys * @param bool $desc * @return mixed */ function array_sort($arr, $keys, $desc = false) { $key_value = $new_array = array(); foreach ($arr as $k => $v) { $key_value[$k] = $v[$keys]; } if ($desc) { arsort($key_value); } else { asort($key_value); } reset($key_value); foreach ($key_value as $k => $v) { $new_array[$k] = $arr[$k]; } return $new_array; } /** * 数据导出到excel(csv文件) * @param $fileName * @param array $tileArray * @param array $dataArray */ function export_excel($fileName, $tileArray = [], $dataArray = []) { ini_set('memory_limit', '512M'); ini_set('max_execution_time', 0); ob_end_clean(); ob_start(); header("Content-Type: text/csv"); header("Content-Disposition:filename=" . $fileName); $fp = fopen('php://output', 'w'); fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));// 转码 防止乱码(比如微信昵称) fputcsv($fp, $tileArray); $index = 0; foreach ($dataArray as $item) { if ($index == 1000) { $index = 0; ob_flush(); flush(); } $index++; fputcsv($fp, $item); } ob_flush(); flush(); ob_end_clean(); } /** * 写入日志 * @param $value * @param string $type */ function log_write($value, $channel = '') { $msg = is_string($value) ? $value : var_export($value, true); if($channel != ''){ Log::channel('task')->write($msg); }else{ Log::channel($channel)->write($msg); } } /** * 获取当前域名及根路径 * @return string */ function base_url() { static $baseUrl = ''; if (empty($baseUrl)) { $request = Request::instance(); //$subDir = str_replace('\\', '/', dirname($request->server('PHP_SELF'))); $baseUrl = $request->scheme() . '://' . $request->host() . '/'; } return $baseUrl; } /** * 左侧填充0 * @param $value * @param int $padLength * @return string */ function pad_left($value, $padLength = 2) { return \str_pad($value, $padLength, "0", STR_PAD_LEFT); } /** * 过滤emoji表情 * @param $text * @return null|string|string[] */ function filter_emoji($text) { // 此处的preg_replace用于过滤emoji表情 // 如需支持emoji表情, 需将mysql的编码改为utf8mb4 return preg_replace('/[\xf0-\xf7].{3}/', '', $text); } /** * 获取全局唯一标识符 * @param bool $trim * @return string */ function getGuidV4($trim = true) { // Windows if (function_exists('com_create_guid') === true) { $charid = com_create_guid(); return $trim == true ? trim($charid, '{}') : $charid; } // OSX/Linux if (function_exists('openssl_random_pseudo_bytes') === true) { $data = openssl_random_pseudo_bytes(16); $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } // Fallback (PHP 4.2+) mt_srand((double)microtime() * 10000); $charid = strtolower(md5(uniqid(rand(), true))); $hyphen = chr(45); // "-" $lbrace = $trim ? "" : chr(123); // "{" $rbrace = $trim ? "" : chr(125); // "}" $guidv4 = $lbrace . substr($charid, 0, 8) . $hyphen . substr($charid, 8, 4) . $hyphen . substr($charid, 12, 4) . $hyphen . substr($charid, 16, 4) . $hyphen . substr($charid, 20, 12) . $rbrace; return $guidv4; } function format_time($value) { return date('Y-m-d', $value); } /** * curl请求指定url (get) * @param $url * @param array $data * @return mixed */ function curl($url, $data = []) { // 处理get数据 if (!empty($data)) { $url = $url . '?' . http_build_query($data); } $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。 $result = curl_exec($curl); curl_close($curl); return $result; } /** * json 转换true,false */ function jsonRecursive(&$array) { foreach ($array as $key => $value) { if (is_array($value)) { jsonRecursive($array[$key]); } else { if($value === 'true'){ $array[$key] = true; } else if($value === 'false'){ $array[$key] = false; } } } } /** * 判断浏览器名称和版本 */ function get_client_browser() { if(empty($_SERVER['HTTP_USER_AGENT'])){ return 'robot!'; } if( (false == strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident')!==FALSE) ){ return 'Internet Explorer 11.0'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 10.0')){ return 'Internet Explorer 10.0'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 9.0')){ return 'Internet Explorer 9.0'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 8.0')){ return 'Internet Explorer 8.0'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 7.0')){ return 'Internet Explorer 7.0'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 6.0')){ return 'Internet Explorer 6.0'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Edge')){ return 'Edge'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Firefox')){ return 'Firefox'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Chrome')){ return 'Chrome'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Safari')){ return 'Safari'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Opera')){ return 'Opera'; } if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'360SE')){ return '360SE'; } //微信浏览器 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessage')){ return 'MicroMessage'; } return ''; } /** * AES 加密 */ function aes_encrypted($requestConfigs, $key = 'sign') { $text = json_encode($requestConfigs); // $key = 'sign'; //⾃定义⼀个key $iv = md5($key,true); //通过MD5将iv参数规定为16位 if (function_exists('openssl_encrypt')) { $encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); } else { $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv); } return base64_encode($encrypted); } /** * AES 解密 */ function aes_decrypted($encrypted, $key = 'sign') { $encrypted = base64_decode($encrypted); // $key = 'sign'; //与加密时⾃定义的key要一致 $iv = md5($key,true); //通过MD5将iv参数规定为16位 if (function_exists('openssl_decrypt')) { $decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); } else { $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv); } return json_decode($decrypted,true); } /** * @param BaseQuery $model * @param string $section * @param string $prefix * @param string $field * @return mixed */ function getModelTime($model, string $section, $prefix = 'create_time', $field = '-',$time = '') { if (!isset($section)) return $model; switch ($section) { case 'today': $model->whereBetween($prefix, [strtotime('today'), strtotime('tomorrow -1second')]); break; case 'week': $model->whereBetween($prefix, [strtotime('this week 00:00:00'), strtotime('next week 00:00:00 -1second')]); break; case 'month': $model->whereBetween($prefix, [strtotime('first Day of this month 00:00:00'), strtotime('first Day of next month 00:00:00 -1second')]); break; case 'year': $model->whereBetween($prefix, [strtotime('this year 1/1'), strtotime('next year 1/1 -1second')]); break; case 'yesterday': $model->whereBetween($prefix, [strtotime('yesterday'), strtotime('today -1second')]); break; case 'quarter': list($startTime, $endTime) = getMonth(); $model = $model->where($prefix, '>', $startTime); $model = $model->where($prefix, '<', $endTime); break; case 'lately7': $model = $model->where($prefix, 'between', [strtotime("-7 day"), strtotime(date('Y-m-d H:i:s'))]); break; case 'lately30': $model = $model->where($prefix, 'between', [strtotime("-30 day"), strtotime(date('Y-m-d H:i:s'))]); break; default: if (strstr($section, $field) !== false) { list($startTime, $endTime) = explode($field, $section); if (strlen($startTime) == 4) { $model->whereBetweenTime($prefix, strtotime($section), strtotime($section . ' +1day -1second')); } else { if ($startTime == $endTime) { $model = $model->whereBetweenTime($prefix, strtotime(date('Y-m-d 0:0:0', strtotime($startTime))), strtotime(date('Y-m-d 23:59:59', strtotime($endTime)))); } else if(strpos($startTime, ':')) { $model = $model->whereBetweenTime($prefix, $startTime, $endTime); } else { $model = $model->whereBetweenTime($prefix, strtotime($startTime), strtotime($endTime . ' +1day -1second')); } } } break; } return $model; } function getDatesBetweenTwoDays($startDate, $endDate, $md = 'm-d') { $dates = []; if (strtotime($startDate) > strtotime($endDate)) { //如果开始日期大于结束日期,直接return 防止下面的循环出现死循环 return $dates; } elseif ($startDate == $endDate) { //开始日期与结束日期是同一天时 array_push($dates, date($md, strtotime($startDate))); return $dates; } else { array_push($dates, date($md, strtotime($startDate))); $currentDate = $startDate; do { $nextDate = date('Y-m-d', strtotime($currentDate . ' +1 days')); array_push($dates, date($md, strtotime($currentDate . ' +1 days'))); $currentDate = $nextDate; } while ($endDate != $currentDate); return $dates; } } function getStartModelTime(string $section) { switch ($section) { case 'today': case 'yesterday': return date('Y-m-d', strtotime($section)); case 'week': return date('Y-m-d', strtotime('this week')); case 'month': return date('Y-m-d', strtotime('first Day of this month')); case 'year': return date('Y-m-d', strtotime('this year 1/1')); case 'quarter': list($startTime, $endTime) = getMonth(); return $startTime; case 'lately7': return date('Y-m-d', strtotime("-7 day")); case 'lately30': return date('Y-m-d', strtotime("-30 day")); default: if (strstr($section, '-') !== false) { list($startTime, $endTime) = explode('-', $section); return date('Y-m-d H:i:s', strtotime($startTime)); } return date('Y-m-d H:i:s'); } } /** * 获取本季度 time * @param int|string $time * @param $ceil * @return array */ function getMonth($time = '', $ceil = 0) { if ($ceil != 0) $season = ceil(date('n') / 3) - $ceil; else $season = ceil(date('n') / 3); $firstday = date('Y-m-01', mktime(0, 0, 0, ($season - 1) * 3 + 1, 1, date('Y'))); $lastday = date('Y-m-t', mktime(0, 0, 0, $season * 3, 1, date('Y'))); return array($firstday, $lastday); }