在PHP項目開發過程中,常用的助手函數:
// 獲取用戶瀏覽器類型 function get_user_bs($bs = null) { if(!isset($_SERVER["HTTP_USER_AGENT"])) return null; $user_agent = strtolower($_SERVER["HTTP_USER_AGENT"]); // 直接檢測傳遞的值 if($bs) return strpos($user_agent, strtolower($bs)) ? true : false; // 固定檢測 if (strpos($user_agent, 'micromessenger')) { $user_bs = 'Weixin'; } elseif (strpos($user_agent, 'qq')) { $user_bs = 'QQ'; } elseif (strpos($user_agent, 'weibo')) { $user_bs = 'Weibo'; } elseif (strpos($user_agent, 'alipayclient')) { $user_bs = 'Alipay'; } elseif (strpos($user_agent, 'trident/7.0')) { $user_bs = 'IE11'; // 新版本IE優先,避免360等瀏覽器的兼容模式檢測錯誤 } elseif (strpos($user_agent, 'trident/6.0')) { $user_bs = 'IE10'; } elseif (strpos($user_agent, 'trident/5.0')) { $user_bs = 'IE9'; } elseif (strpos($user_agent, 'trident/4.0')) { $user_bs = 'IE8'; } elseif (strpos($user_agent, 'msie 7.0')) { $user_bs = 'IE7'; } elseif (strpos($user_agent, 'msie 6.0')) { $user_bs = 'IE6'; } elseif (strpos($user_agent, 'edge')) { $user_bs = 'Edge'; } elseif (strpos($user_agent, 'firefox')) { $user_bs = 'Firefox'; } elseif (strpos($user_agent, 'chrome') || strpos($user_agent, 'android')) { $user_bs = 'Chrome'; } elseif (strpos($user_agent, 'safari')) { $user_bs = 'Safari'; } elseif (strpos($user_agent, 'mj12bot')) { $user_bs = 'MJ12bot'; } else { $user_bs = 'Other'; } return $user_bs; } // 獲取用戶操作系統類型 function get_user_os($osstr = null) { if(!isset($_SERVER["HTTP_USER_AGENT"])) return null; $user_agent = strtolower($_SERVER["HTTP_USER_AGENT"]); // 直接檢測傳遞的值 if($osstr) return strpos($user_agent, strtolower($osstr)) ? true : false; if (strpos($user_agent, 'windows nt 5.0')) { $user_os = 'Windows 2000'; } elseif (strpos($user_agent, 'windows nt 9')) { $user_os = 'Windows 9X'; } elseif (strpos($user_agent, 'windows nt 5.1')) { $user_os = 'Windows XP'; } elseif (strpos($user_agent, 'windows nt 5.2')) { $user_os = 'Windows 2003'; } elseif (strpos($user_agent, 'windows nt 6.0')) { $user_os = 'Windows Vista'; } elseif (strpos($user_agent, 'windows nt 6.1')) { $user_os = 'Windows 7'; } elseif (strpos($user_agent, 'windows nt 6.2')) { $user_os = 'Windows 8'; } elseif (strpos($user_agent, 'windows nt 6.3')) { $user_os = 'Windows 8.1'; } elseif (strpos($user_agent, 'windows nt 10')) { $user_os = 'Windows 10'; } elseif (strpos($user_agent, 'windows phone')) { $user_os = 'Windows Phone'; } elseif (strpos($user_agent, 'android')) { $user_os = 'Android'; } elseif (strpos($user_agent, 'iphone')) { $user_os = 'iPhone'; } elseif (strpos($user_agent, 'ipad')) { $user_os = 'iPad'; } elseif (strpos($user_agent, 'mac')) { $user_os = 'Mac'; } elseif (strpos($user_agent, 'sunos')) { $user_os = 'Sun OS'; } elseif (strpos($user_agent, 'bsd')) { $user_os = 'BSD'; } elseif (strpos($user_agent, 'ubuntu')) { $user_os = 'Ubuntu'; } elseif (strpos($user_agent, 'linux')) { $user_os = 'Linux'; } elseif (strpos($user_agent, 'unix')) { $user_os = 'Unix'; } else { $user_os = 'Other'; } return $user_os; } // 獲取用戶IP function get_user_ip(): string { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $cip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $cip = $_SERVER['HTTP_CLIENT_IP']; } else { $cip = $_SERVER['REMOTE_ADDR']; } if ($cip == '::1') $cip = '127.0.0.1'; // 使用localhost時 if (! preg_match('/^[0-9\.]+$/', $cip)) $cip = '0.0.0.0'; // 非標準的IP return htmlspecialchars($cip); } // 執行URL請求,並返回數據 function get_url($url, $fields = array(), $UserAgent = null, $vfSSL = false) { $SSL = substr($url, 0, 8) == "https://" ? true : false; $ch = curl_init(); // 在HTTP請求中包含一個"User-Agent: "頭的字符串。 $UserAgent ? curl_setopt($ch, CURLOPT_USERAGENT, $UserAgent) : curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); // 在發起連接前等待的時間,如果設置爲0,則無限等待 curl_setopt($ch, CURLOPT_TIMEOUT, 90); // 設置cURL允許執行的最長秒數 curl_setopt($ch, CURLOPT_URL, $url); // 設置請求地址 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 設置cURL 參數,要求結果保存到字符串中還是輸出到屏幕上。 // SSL驗證 if ($SSL) { if ($vfSSL) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_CAINFO, CORE_PATH . '/cacert.pem'); } else { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 不檢查證書中是否設置域名 } } // 數據字段 if ($fields) { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); } $output = curl_exec($ch); if (curl_errno($ch)) error('請求遠程地址錯誤:' . curl_error($ch)); curl_close($ch); return $output; } // 返回時間戳格式化日期時間,默認當前 function get_datetime($timestamp = null) { if (! $timestamp) $timestamp = time(); return date('Y-m-d H:i:s', $timestamp); } // 返回時間戳格式化日期,默認當前 function get_date($timestamp = null) { if (! $timestamp) $timestamp = time(); return date('Y-m-d', $timestamp); } // 返回時間戳差值部分,年、月、日 function get_date_diff($startstamp, $endstamp, $return = 'm') { $y = date('Y', $endstamp) - date('Y', $startstamp); $m = date('m', $endstamp) - date('m', $startstamp); switch ($return) { case 'y': if ($y <= 1) { $y = $m / 12; } $string = $y; break; case 'm': $string = $y * 12 + $m; break; case 'd': $string = ($endstamp - $startstamp) / 86400; break; } return $string; } // 生成無限極樹,$data爲二維數組數據 function get_tree($data, $tid, $idField, $pidField, $sonName = 'son') { $tree = array(); foreach ($data as $key => $value) { if (is_array($value)) { if ($value[$pidField] == "$tid") { // 父親找到兒子 $value[$sonName] = get_tree($data, $value[$idField], $idField, $pidField, $sonName); $tree[] = $value; } } else { if ($value->$pidField == "$tid") { // 父親找到兒子 $temp = clone $value; $temp->$sonName = get_tree($data, $value->$idField, $idField, $pidField, $sonName); $tree[] = $temp; } } } return $tree; } // 返回請求類型 function get_request_method() { return $_SERVER['REQUEST_METHOD']; } // 獲取當前完整URL地址 function get_current_url() { $http_type = is_https() ? 'https://' : 'http://'; return $http_type . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; } // 獲取字符串第N次出現位置 function get_strpos($string, $find, $n) { $pos = strpos($string, $find); for ($i = 2; $i <= $n; $i ++) $pos = strpos($string, $find, $pos + 1); return $pos; } // 字符反轉義html實體及斜槓,支持字符串、數組、對象 function decode_string($string) { if (! $string) return $string; if (is_array($string)) { // 數組處理 foreach ($string as $key => $value) { $string[$key] = decode_string($value); } } elseif (is_object($string)) { // 對象處理 foreach ($string as $key => $value) $string->$key = decode_string($value); } else { // 字符串處理 $string = stripcslashes($string); $string = htmlspecialchars_decode($string, ENT_QUOTES); $string = preg_replace_r('/pboot:if/i', 'pboot@if', $string); // 避免解碼繞過問題 } return $string; } // 字符串雙層MD5加密 function encrypt_string($string) { return md5(md5($string)); } // 生成唯一標識符 function get_uniqid() { return encrypt_string(uniqid(mt_rand(), true)); } // 清洗html代碼的空白符號 function clear_html_blank($string) { $string = str_replace("\r\n", '', $string); // 清除換行符 $string = str_replace("\n", '', $string); // 清除換行符 $string = str_replace("\t", '', $string); // 清除製表符 $string = str_replace(' ', '', $string); // 清除大空格 $string = str_replace(' ', '', $string); // 清除 $string = preg_replace('/\s+/', ' ', $string); // 清除空格 return $string; } // 去除字符串兩端斜線 function trim_slash($string) { return trim($string, '/'); } // 駝峯轉換下劃線加小寫字母 function hump_to_underline($string) { return strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $string)); } // 轉換對象爲數組 function object_to_array($object) { return $object === null ? [] : json_decode(json_encode($object),true); } // 轉換數組爲對象 function array_to_object($array) { return json_decode(json_encode($array)); } // 值是否在對象中 function in_object($needle, $object) { foreach ($object as $value) if ($needle == $value) return true; } // 結果集中查找指定字段父節點是否存在 function result_value_search($needle, $result, $skey) { foreach ($result as $key => $value) if ($value->$skey == $needle) return $key; return false; } // 多維數組合並 function mult_array_merge($array1, $array2) { if (is_array($array2)) { foreach ($array2 as $key => $value) { if (is_array($value)) { $array1[$key] = array_key_exists($key, $array1) ? mult_array_merge($array1[$key], $value) : $value; } else { $array1[$key] = $value; } } } return $array1; } // 數組轉換爲帶引號字符串 function implode_quot($glue, array $pieces, $diffnum = false) { if (! $pieces) return "''"; foreach ($pieces as $key => $value) { if ($diffnum && ! is_numeric($value)) { $value = "'$value'"; } elseif (! $diffnum) { $value = "'$value'"; } if (isset($string)) { $string .= $glue . $value; } else { $string = $value; } } return $string; } // 是否爲多維數組,是返回true function is_multi_array($array) { return is_array($array) ? (count($array) != count($array, 1)) : false; } // 是否爲移動設備 function is_mobile() { $os = get_user_os(); if ($os == 'Android' || $os == 'iPhone' || $os == 'Windows Phone' || $os == 'iPad') return true; } // 是否爲POST請求 function is_post() { return $_POST ? true : false; } // 是否爲GET請求 function is_get() { return $_GET ? true : false; } // 是否爲PUT請求 function is_put() { return $_SERVER['REQUEST_METHOD'] == 'PUT' ? true : false; } // 是否爲PATCH請求 function is_patch() { return $_SERVER['REQUEST_METHOD'] == 'PATCH' ? true : false; } // 是否爲DELETE請求 function is_delete() { return $_SERVER['REQUEST_METHOD'] == 'DELETE' ? true : false; } // 是否爲AJAX請求 function is_ajax() { if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') return true; return false; } // 判斷當前是否爲https function is_https() { if ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on')) { return true; } elseif (isset($_SERVER['REQUEST_SCHEME']) && strtolower($_SERVER['REQUEST_SCHEME']) == 'https') { return true; } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') { return true; } elseif (isset($_SERVER['HTTP_X_CLIENT_SCHEME']) && strtolower($_SERVER['HTTP_X_CLIENT_SCHEME']) == 'https') { return true; } else { return false; } } // 獲取當前訪問地址 function get_http_url($noport = false) { $url = is_https() ? 'https://' . $_SERVER['HTTP_HOST'] : 'http://' . $_SERVER['HTTP_HOST']; if ($noport) $url = str_replace(':' . $_SERVER['SERVER_PORT'], '', $url); return $url; } // 獲取當前訪問域名 function get_http_host($noport = true) { return $noport ? str_replace(':' . $_SERVER['SERVER_PORT'], '', $_SERVER['HTTP_HOST']) : $_SERVER['HTTP_HOST']; } // 服務器信息 function get_server_info() { // 定義輸出常量 define('YES', 'Yes'); define('NO', '<span style="color:red">No</span>'); // 服務器系統 $data['php_os'] = PHP_OS; // 服務器訪問地址 $data['http_host'] = $_SERVER['HTTP_HOST']; // 服務器名稱 $data['server_name'] = $_SERVER['SERVER_NAME']; // 服務器端口 $data['server_port'] = $_SERVER['SERVER_PORT']; // 服務器地址 $data['server_addr'] = isset($_SERVER['LOCAL_ADDR']) ? $_SERVER['LOCAL_ADDR'] : $_SERVER['SERVER_ADDR']; // 服務器軟件 $data['server_software'] = $_SERVER['SERVER_SOFTWARE']; // 站點目錄 $data['document_root'] = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : DOC_PATH; // PHP版本 $data['php_version'] = PHP_VERSION; // 數據庫驅動 $data['db_driver'] = Config::get('database.type'); // php配置文件 $data['php_ini'] = @php_ini_loaded_file(); // 最大上傳 $data['upload_max_filesize'] = ini_get('upload_max_filesize'); // 最大提交 $data['post_max_size'] = ini_get('post_max_size'); // 最大提交文件數 $data['max_file_uploads'] = ini_get('max_file_uploads'); // 內存限制 $data['memory_limit'] = ini_get('memory_limit'); // 檢測gd擴展 $data['gd'] = extension_loaded('gd') ? YES : NO; // 檢測imap擴展 $data['imap'] = extension_loaded('imap') ? YES : NO; // 檢測socket擴展 $data['sockets'] = extension_loaded('sockets') ? YES : NO; // 檢測curl擴展 $data['curl'] = extension_loaded('curl') ? YES : NO; // 會話保存路徑 $data['session_save_path'] = session_save_path() ?: $_SERVER['TMP']; // 檢測standard庫是否存在 $data['standard'] = extension_loaded('standard') ? YES : NO; // 檢測多線程支持 $data['pthreads'] = extension_loaded('pthreads') ? YES : NO; // 檢測XCache支持 $data['xcache'] = extension_loaded('XCache') ? YES : NO; // 檢測APC支持 $data['apc'] = extension_loaded('APC') ? YES : NO; // 檢測eAccelerator支持 $data['eaccelerator'] = extension_loaded('eAccelerator') ? YES : NO; // 檢測wincache支持 $data['wincache'] = extension_loaded('wincache') ? YES : NO; // 檢測ZendOPcache支持 $data['zendopcache'] = extension_loaded('Zend OPcache') ? YES : NO; // 檢測memcache支持 $data['memcache'] = extension_loaded('memcache') ? YES : NO; // 檢測memcached支持 $data['memcached'] = extension_loaded('memcached') ? YES : NO; // 已經安裝模塊 $loaded_extensions = get_loaded_extensions(); $extensions = ''; foreach ($loaded_extensions as $key => $value) $extensions .= $value . ', '; $data['extensions'] = $extensions; return json_decode(json_encode($data)); } // 獲取數據庫類型 function get_db_type() { switch (Config::get('database.type')) { case 'mysqli': case 'pdo_mysql': $db = 'mysql'; break; case 'sqlite': case 'pdo_sqlite': $db = 'sqlite'; break; case 'pdo_pgsql': $db = 'pgsql'; break; default: $db = null; } return $db; } // 獲取間隔的月份的起始及結束日期 function get_month_days($date, $start = 0, $interval = 1, $retamp = false) { $timestamp = strtotime($date) ?: $date; $first_day = strtotime(date('Y', $timestamp) . '-' . date('m', $timestamp) . '-01 +' . $start . ' month'); $last_day = strtotime(date('Y-m-d', $first_day) . ' +' . $interval . ' month -1 day'); return $retamp ? ['first' => $first_day,'last' => $last_day] : ['first' => date('Y-m-d', $first_day),'last' => date('Y-m-d', $last_day)]; } // 中英混合的字符串長度,以一個漢字爲一個單位長度,英文爲半個 function strlen_both($string) { $i = 0; // 實際Byte計數 $n = 0; // 字符串長度計數 $str_length = strlen($string); // 字符串的字節長度 while ($i < $str_length) { $ascnum = Ord(substr($string, $i, 1)); // 得到字符串中第$i位字符的ascii碼 if ($ascnum >= 224) { // 根據UTF-8編碼規範,將3個連續的字符計爲單個字符 $i += 3; $n ++; } elseif ($ascnum >= 192) { // 根據UTF-8編碼規範,將2個連續的字符計爲單個字符 $i += 2; $n ++; } else { $i += 1; $n += 0.5; } } return $n; } // 獲取地址參數 function query_string($unset = null) { if (isset($_SERVER["QUERY_STRING"]) && ! ! $qs = $_SERVER["QUERY_STRING"]) { parse_str($qs, $output); unset($output['page']); $unset = strpos($unset, ',') ? explode(',', $unset) : $unset; if (is_array($unset)) { foreach ($unset as $value) if (isset($output[$value])) unset($output[$value]); } else { if (isset($output[$unset])) unset($output[$unset]); } // 避免路徑參數編碼 if (isset($output['p'])) { $p = 'p=' . $output['p']; unset($output['p']); $qs = $output ? $p . '&' . http_build_query($output) : $p; } else { $qs = http_build_query($output); } } return $qs ? '?' . $qs : ''; } // 生成隨機驗證碼 function create_code($len = 4) { $charset = 'ABCDEFGHKMNPRTUVWXY23456789'; $charset = str_shuffle($charset); $charlen = strlen($charset) - 1; $code = ''; for ($i = 0; $i < $len; $i ++) $code .= $charset[mt_rand(0, $charlen)]; return $code; }
打完收工!