123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188 |
- <?php
- function getArrayItem(array $array,$key = 0, $defaultValue = '')
- {
- if (!is_array($array)){
- return $defaultValue;
- }
- return (isset($array[$key]) && !empty($array[$key])) ? $array[$key] : $defaultValue;
- }
- function loadFile($filepath, $return = false)
- {
- if (file_exists($filepath)) {
- if ($return) {
- return include $filepath;
- } else {
- include $filepath;
- }
- } else {
- throw new \Exception($filepath . ' file cannot be found');
- }
- }
- function xssCheck()
- {
- if (isset($_SERVER['REQUEST_URI'])) {
- $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
- if (strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
- throw new \Exception('request_tainting' . $temp);
- }
- }
- return true;
- }
- /**
- * @param $module string 服务模块名
- * @throws Exception
- */
- function loadServiceConfig($module)
- {
- if (!$module) {
- throw new \Exception('module not null');
- }
- $serviceConfig = ROOT_PATH . DS . '..' . DS . 'Service' . DS . ucfirst($module) . DS . 'Config.php';
- return loadFile($serviceConfig, true);
- }
- /**
- * 写入php错误日志
- *
- * @param string $errno 错误编号
- * @param string $errmsg 错误信息
- * @param string $filename 错误文件
- * @param string $linenum 错误行数
- * @param mixed $vars 错误参数
- *
- */
- function php_error_log($errno, $errmsg, $filename, $linenum, $vars)
- {
- if (!defined('E_STRICT')) define('E_STRICT', 2048);
- $errortype = array(
- E_ERROR => 'Error',
- E_WARNING => 'Warning',
- E_PARSE => 'Parsing Error',
- E_NOTICE => 'Notice',
- E_CORE_ERROR => 'Core Error',
- E_CORE_WARNING => 'Core Warning',
- E_COMPILE_ERROR => 'Compile Error',
- E_COMPILE_WARNING => 'Compile Warning',
- E_USER_ERROR => 'User Error',
- E_USER_WARNING => 'User Warning',
- E_USER_NOTICE => 'User Notice',
- E_STRICT => 'Runtime Notice'
- );
- $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
- $filename = str_replace("\\", '/', $filename);
- $dt = date('Y-m-d H:i:s');
- $err = "#####" . $dt . "\n";
- $err .= "```" . "\n";
- $err .= "datetime :" . $dt . "\n";
- $err .= "errornum :" . $errno . "\n";
- $err .= "errormsg :" . $errortype[$errno] . "\n";
- $err .= "errortype :" . $errmsg . "\n";
- $err .= "scriptname :" . $filename . "\n";
- if (in_array($errno, $user_errors)) {
- $err .= "scriptname :" . wddx_serialize_value($vars, "Variables") . "\n";
- }
- $err .= "scriptlinenum:" . $linenum . "\n";
- $err .= "```\n";
- $logDir = PROJECT_PATH . DS . 'Storage' . DS . 'Logs' . DS . 'SysError' . DS;
- $logFile = $logDir . date('m-d') . '.md';
- if (!is_dir($logDir)) {
- @mkdir($logDir);
- }
- @error_log($err, 3, $logFile);
- @chmod($logFile, 0777);
- }
- function shutdown_function()
- {
- $e = error_get_last();
- if (isset($e['type'])) {
- if (in_array($e['type'], array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR))) {
- php_error_log($e['type'], $e['message'], $e['file'], $e['line'], NULL);
- }
- }
- }
- if (defined('LOG_ERROR') && LOG_ERROR) {
- register_shutdown_function('shutdown_function');
- }
- function isMobile($mobile)
- {
- return preg_match('#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^16[\d]{9}$|^17[0,6,7,8,3,5]{1}\d{8}$|^18[\d]{9}$|^19[\d]{9}$#', $mobile)
- ? true
- : false;
- }
- /**电子邮箱格式校验*/
- function isEmail($email)
- {
- $pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
- return preg_match_all($pattern, $email) ? true : false;
- }
- /**
- * 利用curl模拟浏览器发送请求
- *
- * @param string $url 请求的URL
- * @param array|string $post post数据
- * @param int $timeout 执行超时时间
- * @param boolean $sendcookie 是否发送当前cookie
- * @param array $options 可选的CURL参数
- * @return array
- */
- function request($url, $post = null, $timeout = 40, $sendcookie = true, $options = array(), $ssl = false, $sslDate = array(), $useragent = false, $proxy = false, $http_build_query = true)
- {
- if (empty($useragent)) {
- if (isset($_SERVER['HTTP_USER_AGENT'])) {
- $useragent = $_SERVER['HTTP_USER_AGENT'];
- } else {
- $useragent = 'internalloginuseragent';
- }
- }
- if ($proxy) {
- $ip_long = array(
- array('607649792', '608174079'), //36.56.0.0-36.63.255.255
- array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
- array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
- array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
- array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
- array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
- array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
- array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
- array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
- array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
- );
- $rand_key = mt_rand(0, 9);
- $ip = long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));//随机生成国内某个ip
- $result = getNewProxyId();
- if ($result['error'] != '') {
- echo $result['error'];
- } else {
- $rand_ip = $result['ip'];
- }
- $baseHeader = array(
- "CLIENT-IP:{$ip}",
- "X-FORWARDED-FOR:{$ip}",
- );
- if (isset($options[CURLOPT_HTTPHEADER])) {
- $options[CURLOPT_HTTPHEADER] = array_merge($options[CURLOPT_HTTPHEADER], $baseHeader);
- }
- }
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 35);
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout ? $timeout : 40);
- if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) {
- curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
- }
- if ($sendcookie) {
- $cookie = '';
- foreach ($_COOKIE as $key => $val) {
- $cookie .= rawurlencode($key) . '=' . rawurlencode($val) . ';';
- }
- curl_setopt($ch, CURLOPT_COOKIE, $cookie);
- }
- if ($post) {
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, (is_array($post) && $http_build_query) ? http_build_query($post) : $post);
- }
- if (!ini_get('safe_mode') && ini_get('open_basedir') == '') {
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
- }
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //检查证书中是否设置域名且是否与提供的主机名匹配
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //是否只信任CA颁发的证书
- curl_setopt($ch, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
- if ($ssl) {
- /*curl_setopt($ch, CURLOPT_SSLCERT, '/apps/jindouyun/Public/upload/apiclient_cert.pem');
- curl_setopt($ch, CURLOPT_SSLKEY, '/apps/jindouyun/Public/upload/apiclient_key.pem');*/
- curl_setopt($ch, CURLOPT_SSLCERT, $sslDate['cert']);
- curl_setopt($ch, CURLOPT_SSLKEY, $sslDate['key']);
- }
- foreach ($options as $key => $value) {
- curl_setopt($ch, $key, $value);
- }
- if ($proxy && isset($rand_ip)) {
- curl_setopt($ch, CURLOPT_PROXY, 'http://' . $rand_ip);
- }
- $ret = curl_exec($ch);
- $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $content_length = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
- if (!$content_length) $content_length = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
- $info = curl_getinfo($ch);
- $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
- $errorMsg = curl_error($ch);
- curl_close($ch);
- return array(
- 'httpcode' => $httpcode,
- 'info' => $info,
- 'errorMsg' => $errorMsg,
- 'content_length' => $content_length,
- 'content_type' => $content_type,
- 'content' => $ret
- );
- }
- /**
- * 获取最新的代理ip
- * 代理测试工具 http://proxies.site-digger.com/proxy-test/
- **/
- function getNewProxyId()
- {
- //$url = 'http://webapi.http.zhimacangku.com/getip?num=1&type=2&pro=&city=0&yys=0&port=1&time=1&ts=1&ys=1&cs=1&lb=1&sb=0&pb=4&mr=1®ions=';
- $url = 'http://http.tiqu.qingjuhe.cn/getip?num=1&type=2&pack=35299&port=1&lb=1&pb=4®ions=';
- $data = request($url);
- if ($data['httpcode'] == 200) {
- $content = json_decode($data['content'], true);
- if ($content['success'] == 'true') {
- foreach ($content['data'] as $key => $value) {
- $rand_ip = $value['ip'] . ':' . $value['port'];
- }
- } else {
- $errorMessage = '获取代理ip失败' . $content['code'] . $content['msg'] . PHP_EOL;
- }
- }
- if (isset($rand_ip)) {
- return [
- 'ip' => $rand_ip,
- 'error' => '',
- ];
- } else {
- return [
- 'ip' => '',
- 'error' => $errorMessage,
- ];
- }
- }
- /**
- * 获取当前毫秒时间戳
- */
- function msectime()
- {
- list($msec, $sec) = explode(' ', microtime());
- return (int)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
- }
- /**
- * 断点调试输出方法
- *
- * @param mixed $msg 输出的内容
- *
- * @return string
- */
- function V($msg)
- {
- echo "<pre>";
- var_export($msg);
- exit();
- }
- /**
- * 校验日期格式是否正确
- *
- * @param string $date 日期
- * @param array $formats 需要检验的格式数组
- *
- * @return bool|int
- */
- function checkDateIsValid($date, $formats = ["Y-m-d", "Y/m/d", "Y-m-d H:i:s", "Y/m/d H:i:s"])
- {
- $unixTime = strtotime($date);
- if (!$unixTime) {
- return false;
- }
- foreach ($formats as $format) {
- if (date($format, $unixTime) == $date) {
- return $unixTime;
- }
- }
- return false;
- }
- /**
- * 二维数组根据某个字段排序
- *
- * @param array $needArray 需要排序的二维数组
- * @param string $field 根据的字段排序
- * @param array $sort 排序规则ASC 升序 | DESC 降序
- *
- * @return array;
- */
- function arrayMultiSort(array $needArray, $field, $sort = 'ASC')
- {
- $rule = [];
- $arrSort = [];
- $sort = strtoupper($sort);
- $rule['direction'] = 'SORT_' . $sort;
- $rule['field'] = $field;
- foreach ($needArray AS $uniqid => $row) {
- foreach ($row AS $key => $value) {
- $arrSort[$key][$uniqid] = $value;
- }
- }
- if ($rule['direction']) {
- array_multisort($arrSort[$rule['field']], constant($rule['direction']), $needArray);
- }
- return $needArray;
- }
- /**
- * 利用firephp输出调试到header
- *
- * 需要安装:
- * firefox:FireBug | chrome:FirePHP for Chrome
- *
- * @param mixed $message 要输出的信息
- * @param bool $showtime 是否显示执行时间
- */
- function console($message, $showtime = false)
- {
- static $lasttime = TIME;
- static $_getInstance;
- $thistime = microtime(true);
- $usedtime = $thistime - $lasttime;
- $lasttime = $thistime;
- $label = $showtime ? sprintf("%09.5fs", $usedtime) : NULL;
- if (is_null($_getInstance)) {
- $_getInstance = \Mall\Framework\Core\FirePHP::getInstance(true);
- }
- $_getInstance->info($message, $label);
- }
- /**
- * 检测数组的值不允许为空
- *
- * @param array $params 需要检测的数组
- * @param array $checkKey 需要检测的key默认全部检测
- * @param array $excludeKey 过虑不检测的Key
- *
- * @return string
- */
- function checkNotEmpty($params, $excludeKey = [], $checkKey = [])
- {
- $newParams = [];
- if ($checkKey && is_array($checkKey)) {
- foreach ($checkKey as $key) {
- if (isset($params[$key])) {
- $newParams[$key] = $params[$key];
- }
- }
- }
- if ($newParams) {
- $params = $newParams;
- }
- if (is_array($params)) {
- foreach ($params as $k => $v) {
- if (in_array($k, $excludeKey, true)) {
- continue;
- }
- if (is_array($v)) {
- checkNotEmpty($v);
- }
- if (empty($v)) {
- return $k . ' 不允许为空';
- }
- }
- }
- }
- /**
- * 友好格式化时间
- * @param int $timestamp 时间
- * @param array $formats
- * @return string
- */
- function formatDateTime($timestamp, $formats = null)
- {
- if ($formats == null) {
- $formats = array(
- 'DAY' => '%s天前',
- 'DAY_HOUR' => '%s天%s小时前',
- 'HOUR' => '%s小时',
- 'HOUR_MINUTE' => '%s小时%s分前',
- 'MINUTE' => '%s分钟前',
- 'MINUTE_SECOND' => '%s分钟%s秒前',
- 'SECOND' => '%s秒前',
- );
- }
- /* 计算出时间差 */
- $seconds = time() - $timestamp;
- $minutes = floor($seconds / 60);
- $hours = floor($minutes / 60);
- $days = floor($hours / 24);
- if ($days > 0 && $days < 31) {
- $diffFormat = 'DAY';
- } elseif ($days == 0) {
- $diffFormat = ($hours > 0) ? 'HOUR' : 'MINUTE';
- if ($diffFormat == 'HOUR') {
- $diffFormat .= ($minutes > 0 && ($minutes - $hours * 60) > 0) ? '_MINUTE' : '';
- } else {
- $diffFormat = (($seconds - $minutes * 60) > 0 && $minutes > 0)
- ? $diffFormat . '_SECOND' : 'SECOND';
- }
- } else {
- $diffFormat = 'TURE_DATE_TIME';//超出30天, 正常时间显示
- }
- $dateDiff = null;
- switch ($diffFormat) {
- case 'DAY':
- $dateDiff = sprintf($formats[$diffFormat], $days);
- break;
- case 'DAY_HOUR':
- $dateDiff = sprintf($formats[$diffFormat], $days, $hours - $days * 60);
- break;
- case 'HOUR':
- $dateDiff = sprintf($formats[$diffFormat], $hours);
- break;
- case 'HOUR_MINUTE':
- $dateDiff = sprintf($formats[$diffFormat], $hours, $minutes - $hours * 60);
- break;
- case 'MINUTE':
- $dateDiff = sprintf($formats[$diffFormat], $minutes);
- break;
- case 'MINUTE_SECOND':
- $dateDiff = sprintf($formats[$diffFormat], $minutes, $seconds - $minutes * 60);
- break;
- case 'SECOND':
- $dateDiff = sprintf($formats[$diffFormat], $seconds);
- break;
- default:
- $dateDiff = date('Y-m-d H:i:s',$timestamp);
- }
- return $dateDiff;
- }
- /**
- * 数组交叉排序并合并
- *
- * @param array $needo
- * @param array $needt
- *
- * @return array
- */
- function sortCross(array $needo = [], array $needt = [])
- {
- $newData = [];
- $needoCount = count($needo);
- $needtCount = count($needt);
- $size = $needoCount > $needtCount ? $needoCount : $needtCount;
- for ($i = 0; $i < $size; $i++) {
- if (isset($needo[$i])) {
- array_push($newData, $needo[$i]);
- }
- if (isset($needt[$i])) {
- array_push($newData, $needt[$i]);
- }
- }
- return $newData;
- }
- /**
- * 二维数组去重
- *
- * @param $list
- * @param $key
- *
- * @return array
- */
- function assocUnique($list, $key)
- {
- $arr = array();
- for ($i = 0; $i < count($list); $i++) {
- if (isset($list[$i][$key])) {
- if (!isset($arr[$list[$i][$key]])) {
- $arr[$list[$i][$key]] = $list[$i];
- }
- }
- }
- return array_values($arr);
- }
- /**
- * 为相对路径的缩略图加绝对地址
- *
- * @param string|array $thumbs 图片集合
- * @param string $key 图片地址的Key
- *
- * @return array
- */
- function absoluteImg($thumbs, $key = '')
- {
- if ($thumbs) {
- if (is_array($thumbs)) {
- foreach ($thumbs as &$t) {
- if ($key) {
- $value = $t[$key];
- } else {
- $value = $t;
- }
- if (!$value) {
- continue;
- }
- if (!filter_var($value, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) {
- if ($key) {
- $t[$key] = URL_UPLOAD . $value;
- } else {
- $t = URL_UPLOAD . $value;
- }
- }
- }
- }
- if (is_string($thumbs)) {
- if (!filter_var($thumbs, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) {
- $thumbs = URL_UPLOAD . $thumbs;
- }
- }
- }
- return $thumbs;
- }
- /**
- * 对内容字段进行 int 整形转换
- *
- * @param array $params
- *
- * @return array
- */
- function contentIntValFormat(array $params)
- {
- $intVal = [
- 'id',
- 'appid',
- 'has_thumb',
- 'catid',
- 'created',
- 'createdby',
- 'published',
- 'publishedby',
- 'modified',
- 'modifiedby',
- 'digg',
- 'pv',
- 'virtual_pv',
- 'status',
- 'indexid',
- 'contentid',
- 'pagecount',
- 'weight',
- 'commend',
- 'noexpiration',
- 'commend_pv',
- 'iscount'
- ];
- foreach ($params as $k => $param) {
- if (in_array($k, $intVal, true)) {
- $params[$k] = intval($param);
- }
- }
- return $params;
- }
- /**
- * 根据用户年月日算出星座
- *
- * @param string $dob 出生年月 1990-12-18
- *
- * @return string
- */
- function constellation($dob)
- {
- $dob = date("m-d", strtotime($dob));
- list($month, $day) = explode("-", $dob);
- $constellation = '';
- if (($month == 3 || $month == 4) && ($day > 22 || $day < 21)) {
- $constellation = "Aries";
- } else if (($month == 4 || $month == 5) && ($day > 22 || $day < 22)) {
- $constellation = "Taurus";
- } else if (($month == 5 || $month == 6) && ($day > 23 || $day < 22)) {
- $constellation = "Gemini";
- } else if (($month == 6 || $month == 7) && ($day > 23 || $day < 23)) {
- $constellation = "Cancer";
- } else if (($month == 7 || $month == 8) && ($day > 24 || $day < 22)) {
- $constellation = "Leo";
- } else if (($month == 8 || $month == 9) && ($day > 23 || $day < 24)) {
- $constellation = "Virgo";
- } elseif (($month == 9 || $month == 10) && ($day > 25 || $day < 24)) {
- $constellation = "Libra";
- } else if (($month == 10 || $month == 11) && ($day > 25 || $day < 23)) {
- $constellation = "Scorpio";
- } else if (($month == 11 || $month == 12) && ($day > 24 || $day < 23)) {
- $constellation = "Sagittarius";
- } else if (($month == 12 || $month == 1) && ($day > 24 || $day < 21)) {
- $constellation = "Cpricorn";
- } else if (($month == 1 || $month == 2) && ($day > 22 || $day < 20)) {
- $constellation = "Aquarius";
- } else if (($month == 2 || $month == 3) && ($day > 21 || $day < 21)) {
- $constellation = "Pisces";
- }
- return $constellation;
- }
- /**
- * 随机生成短信验证码
- * @param int $length 验证码长度
- * @return int
- */
- function generate_code($length = 6)
- {
- return rand(pow(10, ($length - 1)), pow(10, $length) - 1);
- }
- /**
- * 计算两点地理坐标之间的距离
- * @param string $longitude1 起点经度
- * @param string $latitude1 起点纬度
- * @param string $longitude2 终点经度
- * @param string $latitude2 终点纬度
- * @param int $unit 单位 1:米 2:公里
- * @param int $decimal 精度 保留小数位数
- * @return string
- */
- function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit = 2, $decimal = 2)
- {
- $EARTH_RADIUS = 6370.996; // 地球半径系数
- $PI = 3.1415926;
- $radLat1 = $latitude1 * $PI / 180.0;
- $radLat2 = $latitude2 * $PI / 180.0;
- $radLng1 = $longitude1 * $PI / 180.0;
- $radLng2 = $longitude2 * $PI / 180.0;
- $a = $radLat1 - $radLat2;
- $b = $radLng1 - $radLng2;
- $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
- $distance = $distance * $EARTH_RADIUS * 1000;
- if ($unit == 2) {
- $distance = $distance / 1000;
- }
- return round($distance, $decimal);
- }
- /**
- * @param int $month 月份
- * @param int $year 年
- *
- * @return mixed
- */
- function getMonthBeginToEnd($month, $year = 0)
- {
- $beginDate = 0;
- $endDate = 0;
- if ($month = intval($month)) {
- if (!$year) {
- $year = date('Y', time());
- }
- $beginDate = strtotime("{$year}-{$month}-01");
- $endDate = strtotime(date('Y-m-t', $beginDate));
- }
- return [
- 'beginTime' => $beginDate,
- 'endTime' => $endDate
- ];
- }
- /**
- * 格式化商品价格
- *
- * @access public
- * @param float $price 商品价格
- * @return string
- */
- function priceFormat($price)
- {
- return number_format($price, 2, '.', '');
- }
- /**
- * 数组转xml内容
- *
- * @param array $arr 数组
- * @return string
- */
- function arrayToXml($arr)
- {
- $xml = '';
- foreach ($arr as $key => $value) {
- if (is_string($value)) {
- $xml .= '<' . $key . '><![CDATA[' . $value . ']]></' . $key . '>';
- } else {
- $xml .= '<' . $key . '>' . $value . '</' . $key . '>';
- }
- }
- return $xml;
- }
- //数组转xml
- function arrayToWeiXinXml($arr)
- {
- $xml = '<xml>';
- foreach($arr as $key => $value){
- if (is_string($value)) {
- $xml .= '<' . $key . '><![CDATA[' . $value . ']]></' . $key . '>';
- } else {
- $xml .= '<' . $key . '>' . $value . '</' . $key . '>';
- }
- }
- $xml .='</xml>';
- return $xml;
- }
- /**
- * xml转json格式数据
- *
- * @param string $xml xml格式文件内容
- * @return string
- */
- function XML2JSON($xml)
- {
- function normalizeSimpleXML($obj, &$result)
- {
- $data = $obj;
- if (is_object($data)) {
- $data = get_object_vars($data);
- }
- if (is_array($data)) {
- foreach ($data as $key => $value) {
- $res = null;
- normalizeSimpleXML($value, $res);
- if (($key == '@attributes') && ($key)) {
- $result = $res;
- } else {
- $result[$key] = $res;
- }
- }
- } else {
- $result = $data;
- }
- }
- normalizeSimpleXML(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA), $result);
- return json_encode($result, JSON_UNESCAPED_UNICODE);
- }
- /**
- * 分页方法
- */
- function pageToOffset($page = 1, $pageSize = 10)
- {
- return [
- 'limit' => $pageSize,
- 'offset' => ($page - 1) * $pageSize,
- ];
- }
- /**
- * PHP截取UTF-8字符串,解决半字符问题。
- * 英文、数字(半角)为1字节(8位),中文(全角)为2字节
- * 取出的字符串, 当$len小于等于0时, 会返回整个字符串
- * @param string $str 源字符串
- * @param int $len 左边的子串的长度
- */
- function utf_substr($str, $len)
- {
- $new_str = [];
- for ($i = 0; $i < $len; $i++) {
- $temp_str = substr($str, 0, 1);
- if (ord($temp_str) > 127) {
- if ($i < $len) {
- $new_str[] = substr($str, 0, 3);
- $str = substr($str, 3);
- }
- } else {
- $new_str[] = substr($str, 0, 1);
- $str = substr($str, 1);
- }
- }
- return join($new_str);
- }
- function isCardNo($vStr)
- {
- $vCity = array(
- '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 (!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/', $vStr)) return false;
- if (!in_array(substr($vStr, 0, 2), $vCity)) return false;
- $vStr = preg_replace('/[xX]$/i', 'a', $vStr);
- $vLength = strlen($vStr);
- if ($vLength == 18) {
- $vBirthday = substr($vStr, 6, 4) . '-' . substr($vStr, 10, 2) . '-' . substr($vStr, 12, 2);
- } else {
- $vBirthday = '19' . substr($vStr, 6, 2) . '-' . substr($vStr, 8, 2) . '-' . substr($vStr, 10, 2);
- }
- if (date('Y-m-d', strtotime($vBirthday)) != $vBirthday) return false;
- if ($vLength == 18) {
- $vSum = 0;
- for ($i = 17; $i >= 0; $i--) {
- $vSubStr = substr($vStr, 17 - $i, 1);
- $vSum += (pow(2, $i) % 11) * (($vSubStr == 'a') ? 10 : intval($vSubStr, 11));
- }
- if ($vSum % 11 != 1) return false;
- }
- return true;
- }
- /**
- * try_catch 统一写入日志方法
- * @param object $logger Factory::logs
- * @param $exception 捕获的异常内容
- */
- function catchError($logger, $exception)
- {
- $error = '错误类型:' . get_class($exception) . PHP_EOL;
- $error .= '错误代码:' . $exception->getCode() . PHP_EOL;
- $error .= '错误信息:' . $exception->getMessage() . PHP_EOL;
- $error .= '错误堆栈:' . $exception->getTraceAsString() . PHP_EOL;
- $logger && $logger->log($error, 'error');
- }
- /**
- * 资金元单位转化为分单位
- * @param float 元
- * @return int 分
- */
- function yuanToFen($yuan)
- {
- $fen = strval($yuan * 100);
- return intval($fen);
- }
- /**
- * 资金分单位转化为元单位
- * @param int 分
- * @return float 元
- */
- function fenToYuan($fen)
- {
- $fen = $fen / 100;
- return $fen;
- }
- /**
- * 千克转为克
- * @param string|float
- * @return int
- */
- function kgTog($kg)
- {
- $g = strval($kg * 1000);
- return $g = intval($g);
- }
- /**
- * 克转为千克
- * @param string|float
- * @return int
- */
- function gToKg($kg)
- {
- $kg = $kg / 1000;
- return $kg;
- }
- /**
- * 元/千克 转为 分/克 并保留8位有效数字
- * @param string|float
- * @return int
- */
- function kgYuanTogFenDanWei($KgYuan)
- {
- $gFen = $KgYuan / 10;
- return $gFen;
- }
- function floatDiv($param)
- {
- return $param / 100000000;
- }
- function floatMul($param)
- {
- return $param * 100000000;
- }
- /**
- * 分/克 转为 元/千克
- * @param string|float
- * @return int
- */
- function gFenToKgYuanDanWei($gFen)
- {
- $kgYuan = $gFen * 10;
- return $kgYuan;
- }
- /**
- * 获取当前的时间(毫秒)
- * @return float
- */
- function getMillisecond()
- {
- list($t1, $t2) = explode(' ', microtime());
- return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
- }
- /**
- * 多维数组转树状结构
- *
- * @param $tree
- * @param int $rootId
- * @return array
- */
- function arr2tree($tree, $rootId = 0)
- {
- $return = [];
- foreach ($tree as $leaf) {
- if ($leaf['pid'] == $rootId) {
- foreach ($tree as $subleaf) {
- if ($subleaf['pid'] == $leaf['id']) {
- $leaf['children'] = arr2tree($tree, $leaf['id']);
- break;
- }
- }
- $return[] = $leaf;
- }
- }
- return $return;
- }
- /**
- * <生成订单号>
- * 规则说明: 来源(pc/ios/android)1位 + 订单类型标示(海淘/门票)1位 + 时间戳转日期(20171107)8位 + 用户id(2位) + 毫秒时间提取(4位)
- * @param $orderFrom
- * @param $orderTypeId
- * @param $userId
- * @return int
- */
- function createOrderSn($orderFrom, $orderTypeId, $userId)
- {
- $no = $orderFrom . $orderTypeId . date('Ymd') . substr(strval($userId + 100), -2) . substr(microtime(), 2, 4) . sprintf('%02d', rand(1000, 9999));
- return $no;
- }
- /**
- * 按照日期生成流水号
- * @param string $maxNo 当天最后一条数据编号
- */
- function createSerialNumberByDate($maxNo = '',$dateLength = 8, $lenght = 4)
- {
- $number = 0;
- if( !empty($maxNo) ){
- $todayLastNo = explode('-',$maxNo);
- $number = intval($todayLastNo[1]);
- }
- $number = $number+1;
- switch ($dateLength){
- case 12: // 根据年月日时分生成流水号
- $date = date('YmdHi',time());
- break;
- case 14: // 根据年月日时分秒生成流水号
- $date = date('YmdHis',time());
- break;
- default: // 根据年月日生成流水号
- $date = date('Ymd',time());
- }
- return $date.'-'.str_pad($number,$lenght,'0',STR_PAD_LEFT);
- }
- /**
- * 生成编码
- * @param $prefix 编码前缀 例如:采购入库单 CGRK
- * @param $id 自动id
- * @param int $length 编码长度
- * @return string
- */
- function createCode($prefix, $id, $length = 6)
- {
- $idLength = strlen((string)$id);
- $leaveLength = $length - $idLength;
- $zeroStr = "";
- if ($leaveLength > 0) {
- $zeroStr = str_repeat('0', $leaveLength);
- }
- return strtoupper($prefix) . $zeroStr . $id;
- }
- /**
- * 随机生成16位字符串
- * @return string 生成的字符串
- */
- function getRandomStr($lenght = 16)
- {
- $str = "";
- $str_pol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
- $max = strlen($str_pol) - 1;
- for ($i = 0; $i < $lenght; $i++) {
- $str .= $str_pol[mt_rand(0, $max)];
- }
- return $str;
- }
- /*
- * uuid 唯一序列码
- */
- function uuid($prefix = '')
- {
- $chars = md5(uniqid(mt_rand(), true));
- $uuid = substr($chars,0,8) . '-';
- $uuid .= substr($chars,8,4) . '-';
- $uuid .= substr($chars,12,4) . '-';
- $uuid .= substr($chars,16,4) . '-';
- $uuid .= substr($chars,20,12);
- return $prefix . $uuid;
- }
- /**
- * 获取 当天,昨天,本周,本月,本年时间戳
- */
- function gettimestamp($name = 'today',$param = ''){
- switch ($name){
- case 'today'://今天
- $timeamp['start'] = strtotime(date('Y-m-d'));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('+1 day')));
- break;
- case 'yesterday'://昨天
- $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-1 day')));
- $timeamp['end'] = strtotime(date('Y-m-d'));
- break;
- case 'beforyesterday'://前天
- $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-2 day')));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('-1 day')));
- break;
- case 'beforweek'://本周
- $timeamp['start'] = strtotime(date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y"))));
- $timeamp['end'] = strtotime(date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y"))));
- break;
- case 'nowmonth'://本月
- $timeamp['start'] = strtotime(date('Y-m-01'));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('+1 day')));
- break;
- case 'permonth'://上月
- $timeamp['start'] = strtotime(date('Y-m-01',strtotime('-1 month')));
- $timeamp['end'] = strtotime(date('Y-m-01'));
- break;
- case 'preweek'://上周 注意我们是从周一开始算
- $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-2 week Monday')));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('-1 week Monday +1 day')));
- break;
- case 'nowweek'://本周
- $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-1 week Monday')));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('+1 day')));
- break;
- case 'preday'://近三个月
- // $timeamp['start'] = strtotime(date('Y-m-d'),strtotime($param.' day'));
- $timeamp['start'] = strtotime("-0 year -3 month -0 day");
- $timeamp['end'] = strtotime(date('Y-m-d'));
- break;
- case 'nextday'://30
- $timeamp['start'] = strtotime(date('Y-m-d'));
- $timeamp['end'] = strtotime(date('Y-m-d'),strtotime($param.' day'));
- break;
- case 'preyear'://去年
- $timeamp['start'] = strtotime(date('Y-01-01',strtotime('-1 year')));
- $timeamp['end'] = strtotime(date('Y-12-31',strtotime('-1 year')));
- break;
- case 'nowyear'://今年
- $timeamp['start'] = strtotime(date('Y-01-01'));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('+1 day')));
- break;
- case 'quarter'://季度
- $quarter = empty($param) ? ceil((date('n'))/3) : $param;//获取当前季度
- $timeamp['start'] = mktime(0, 0, 0,$quarter*3-2,1,date('Y'));
- $timeamp['end'] = mktime(0, 0, 0,$quarter*3+1,1,date('Y'));
- // $timeamp['end'] = mktime(23,59,59,$quarter*3,date('t',mktime(0, 0 , 0,$quarter*3,1,date("Y"))),date('Y'));
- break;
- default:
- $timeamp['start'] = strtotime(date('Y-m-d'));
- $timeamp['end'] = strtotime(date('Y-m-d',strtotime('+1 day')));
- break;
- }
- return $timeamp;
- }
|