PHP---開發常用助手函數

在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('&nbsp;', '', $string); // 清除 &nbsp;
    $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;
}

打完收工!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章