【一】PHP實用自定義函數

前言

我清楚的記得,是誰在我耳邊說:「PHP是世界上最好的語言」,反正我可沒說哈(理不直氣還壯),我就聽過這種言論,畢竟我膽小,哪裏敢在公衆場合說這種話,關於「誰是最好語言的言論」,很早以前,就在IT界掀起過多場血雨腥風的爭論都無果,我們就不要再搞事了,老老實實搬磚……php

好了,蝦扯蛋完畢,開始說點正事,我後續會陸續寫一些PHP開發中實用的一些自定義函數,方便用到的朋友,可以快速開發和使用。html

返回格式化時間

咱們在開發過程當中,總會遇到一些顯示時間的問題,有的時候須要顯示年-月-日,有的時候須要顯示年-月-日 時.分.秒,在每次遇到使用的時候,都會重複的寫着一行相似date($time, 'Y-m-d H:i:s')的代碼,想不想有一個更加優雅的寫法呢,那就是自定義一個函數,就是下面定義的函數,使用的時候,若是時間格式是默認的,那麼直接調用函數time_format($time)傳入時間戳就能夠了,是否是感受這種看着就舒服一點呢?api

/**
 * 返回格式化時間
 * @param int $time 時間戳
 * @param string $format 時間格式
 * @return bool|string
 */
function time_format($time = 0, $format = '')
{
    // 默認時間格式
    if (empty($format)) {
        $format = 'Y-m-d H:i:s';
    }
    $format_time = date($format, $time);
    return $format_time;
}
複製代碼

格式化數字

關於數字的格式處理的時候,我想你們都沒少遇到,甚至還由於某數據顯示的數字沒有格式化而被測試提過bug呢?反正我是被測試抓到過,還不得不改的那種,好比:沒有保留兩位小數了等,而後就老老實實修改代碼,把原來沒處理的數字格式化一下,寫法爲number_format($number, 2, '.', ','),發現一口氣傳了4個參數,並且,假如,$number不是數字,那麼這個函數就會報錯了,因此,還不如自定義一個,方便快捷,直接使用number_format_plus($number)就搞定了!數組

/**
 * 返回格式化數字
 * @param int $number 待格式化數字
 * @param int $decimals 保留小數位數,默認2位
 * @param string $dec_point 整數和小數分隔符號
 * @param string $thousands_sep 整數部分每三位數讀分隔符號
 * @return string
 */
function number_format_plus($number = 0, $decimals = 2, $dec_point = '.', $thousands_sep = ',')
{
    $format_num = '0.00';
    if (is_numeric($number)) {
        $format_num = number_format($number, $decimals, $dec_point, $thousands_sep);
    }
    return $format_num;
}
複製代碼

人民幣數字小寫轉大寫

人民幣轉大寫,這種通常在合同類的文件中會遇到的比較多,由於我以前工做中都接觸到一些合同類的文件處理,因此,這個函數我一直用着,好的東西固然得拿出來分享了,萬一你也恰好有須要呢瀏覽器

/**
 * 人民幣數字小寫轉大寫
 * @param string $number 人民幣數值
 * @param string $int_unit 幣種單位,默認"元",有的需求可能爲"圓"
 * @param bool $is_round 是否對小數進行四捨五入
 * @param bool $is_extra_zero 是否對整數部分以0結尾,小數存在的數字附加0,好比1960.30
 * @return string
 */
function rmb_format($money = 0, $int_unit = '元', $is_round = true, $is_extra_zero = false)
{
    // 非數字,原樣返回
    if (!is_numeric($money)) {
        return $money;
    }
    // 將數字切分紅兩段
    $parts = explode('.', $money, 2);
    $int = isset($parts[0]) ? strval($parts[0]) : '0';
    $dec = isset($parts[1]) ? strval($parts[1]) : '';
    // 若是小數點後多於2位,不四捨五入就直接截,不然就處理
    $dec_len = strlen($dec);
    if (isset($parts[1]) && $dec_len > 2) {
        $dec = $is_round ? substr(strrchr(strval(round(floatval("0." . $dec), 2)), '.'), 1) : substr($parts [1], 0, 2);
    }
    // 當number爲0.001時,小數點後的金額爲0元
    if (empty($int) && empty($dec)) {
        return '零';
    }
    // 定義
    $chs = ['0', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'];
    $uni = ['', '拾', '佰', '仟'];
    $dec_uni = ['角', '分'];
    $exp = ['', '萬'];
    $res = '';
    // 整數部分從右向左找
    for ($i = strlen($int) - 1, $k = 0; $i >= 0; $k++) {
        $str = '';
        // 按照中文讀寫習慣,每4個字爲一段進行轉化,i一直在減
        for ($j = 0; $j < 4 && $i >= 0; $j++, $i--) {
            // 非0的數字後面添加單位
            $u = $int{$i} > 0 ? $uni [$j] : '';
            $str = $chs [$int{$i}] . $u . $str;
        }
        // 去掉末尾的0
        $str = rtrim($str, '0');
        // 替換多個連續的0
        $str = preg_replace("/0+/", "零", $str);
        if (!isset($exp [$k])) {
            // 構建單位
            $exp [$k] = $exp [$k - 2] . '億';
        }
        $u2 = $str != '' ? $exp [$k] : '';
        $res = $str . $u2 . $res;
    }
    // 若是小數部分處理完以後是00,須要處理下
    $dec = rtrim($dec, '0');
    // 小數部分從左向右找
    if (!empty($dec)) {
        $res .= $int_unit;
        // 是否要在整數部分以0結尾的數字後附加0,有的系統有這要求
        if ($is_extra_zero) {
            if (substr($int, -1) === '0') {
                $res .= '零';
            }
        }
        for ($i = 0, $cnt = strlen($dec); $i < $cnt; $i++) {
            // 非0的數字後面添加單位
            $u = $dec{$i} > 0 ? $dec_uni [$i] : '';
            $res .= $chs [$dec{$i}] . $u;
            if ($cnt == 1)
                $res .= '整';
        }
        // 去掉末尾的0
        $res = rtrim($res, '0');
        // 替換多個連續的0
        $res = preg_replace("/0+/", "零", $res);
    } else {
        $res .= $int_unit . '整';
    }
    return $res;
}
複製代碼

生成短網址

國內也有好多短網址生成接口,可是發現國外的tinyurl.com的提供的短網址接口很方便使用,直接須要傳入一個網址就能生成一個短連接了,至於安全性和速度性能啥的,就再說了,我以前,也有寫過一篇文章,關於新浪短網址的生成,有興趣的話能夠查看一下,文章入口-新浪微博API生成短連接安全

/**
 * 獲取短網址連接
 * @param string $url 原始網址
 * @return string
 */
function get_short_url($url = '')
{
    // 直接請求第三方接口地址,獲取短URL
    $api_url = 'http://tinyurl.com/api-create.php?url=';
    $short_url = file_get_contents($api_url . $url);
    return $short_url;
}
複製代碼

獲取用戶真實的IP地址

在須要分析用戶的行爲和操做日誌的時候,確定會遇到須要獲取用戶的IP地址的需求,由於在互聯網中,能定位用戶的,最有效最直接的就是IP地址,固然,也有人使用代理或者其餘方式修改IP地址,致使這樣獲取的IP地址可能不許確,可是正常狀況,這個方法獲取用戶的IP地址徹底夠用了。bash

/**
 * 獲取用戶真實的IP地址
 * @return mixed
 */
function get_real_ip()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
複製代碼

導出excel表格數據

咱們經常使用的導出Excel表格的庫類有PHPExcel等,可是,想不想不借助任何庫類,能直接導出Excel表格數據呢,固然是有辦法的,那就是直接利用htmltable表格來生成表格數據並導出。網絡

/**
 * 導出excel表格數據
 * @param array $data 表格數據,一個二維數組
 * @param array $title 第一行標題,一維數組
 * @param string $filename 下載的文件名
 */
function export_excel($data = [], $title = [], $filename = '')
{
    // 默認文件名爲時間戳
    if (empty($filename)) {
        $filename = time();
    }
    // 定義輸出header信息
    header("Content-type:application/octet-stream;charset=GBK");
    header("Accept-Ranges:bytes");
    header("Content-type:application/vnd.ms-excel");
    header("Content-Disposition:attachment;filename=" . $filename . ".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    ob_start();
    echo "<head><meta http-equiv='Content-type' content='text/html;charset=GBK' /></head> <table border=1 style='text-align:center'>\n";
    // 導出xls開始,先寫表頭
    if (!empty($title)) {
        foreach ($title as $k => $v) {
            $title[$k] = iconv("UTF-8", "GBK//IGNORE", $v);
        }
        $title = "<td>" . implode("</td>\t<td>", $title) . "</td>";
        echo "<tr>$title</tr>\n";
    }
    // 再寫表數據
    if (!empty($data)) {
        foreach ($data as $key => $val) {
            foreach ($val as $ck => $cv) {
                if (is_numeric($cv) && strlen($cv) < 12) {
                    $data[$key][$ck] = '<td>' . mb_convert_encoding($cv, "GBK", "UTF-8") . "</td>";
                } else {
                    $data[$key][$ck] = '<td style="vnd.ms-excel.numberformat:@;">' . iconv("UTF-8", "GBK//IGNORE", $cv) . "</td>";
                }
            }
            $data[$key] = "<tr>" . implode("\t", $data[$key]) . "</tr>";
        }
        echo implode("\n", $data);
    }
    echo "</table>";
    ob_flush();
    exit;
}
複製代碼

下載文件(支持斷點續傳)

有的時候,咱們從網上下載文件,可是有的時候下載一個大文件,忽然下載到一半或者即將完成的時候,忽然來了個網絡失敗,致使下載暫停中斷了,若是等會網絡恢復了,你又要從新開始下載,是否是得罵娘那種,可是呢,若是網絡恢復了,你可以繼續從網絡中斷以前的位置繼續下載,是否是又開心了,固然,咱們都但願是這樣,可是有些黑心開發者,就可能不會讓你開心,因此,你是想當不讓人開心的黑心開發者仍是作個好人呢,奉勸你們都作個善良的人吧,哈哈哈app

/**
 * 支持斷點續傳,下載文件
 * @param string $file 下載文件完整路徑
 */
function download_file_resume($file)
{
    // 檢測文件是否存在
    if (!is_file($file)) {
        die("非法文件下載!");
    }
    // 打開文件
    $fp = fopen("$file", "rb");
    // 獲取文件大小
    $size = filesize($file);
    // 獲取文件名稱
    $filename = basename($file);
    // 獲取文件擴展名
    $file_extension = strtolower(substr(strrchr($filename, "."), 1));
    // 根據擴展名 指出輸出瀏覽器格式
    switch ($file_extension) {
        case "exe":
            $ctype = "application/octet-stream";
            break;
        case "zip":
            $ctype = "application/zip";
            break;
        case "mp3":
            $ctype = "audio/mpeg";
            break;
        case "mpg":
            $ctype = "video/mpeg";
            break;
        case "avi":
            $ctype = "video/x-msvideo";
            break;
        default:
            $ctype = "application/force-download";
    }
    // 通用header頭信息
    header("Cache-Control:");
    header("Cache-Control: public");
    header("Content-Type: $ctype");
    header("Content-Disposition: attachment; filename=$filename");
    header("Accept-Ranges: bytes");
    // 若是有$_SERVER['HTTP_RANGE']參數
    if (isset($_SERVER['HTTP_RANGE'])) {
        // 斷點後再次鏈接$_SERVER['HTTP_RANGE']的值
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
        str_replace($range, "-", $range);
        // 文件總字節數
        $size2 = $size - 1;
        // 獲取下次下載的長度
        $new_length = $size2 - $range;
        header("HTTP/1.1 206 Partial Content");
        // 輸入總長
        header("Content-Length: $new_length");
        header("Content-Range: bytes $range$size2/$size");
        // 設置指針位置
        fseek($fp, $range);
    } else {
        // 第一次鏈接下載
        $size2 = $size - 1;
        header("Content-Range: bytes 0-$size2/$size");
        // 輸出總長
        header("Content-Length: " . $size);
    }
    // 虛幻輸出
    while (!feof($fp)) {
        // 設置文件最長執行時間
        set_time_limit(0);
        // 輸出文件
        print(fread($fp, 1024 * 8));
        // 輸出緩衝
        flush();
        ob_flush();
    }
    fclose($fp);
    exit;
}
複製代碼

最後

好了,第一篇我就先大概分享這幾個函數,後續會慢慢更新其餘的實用函數,若是你們有其餘好玩的、好用的歡迎分享出來,你們一塊兒學習和交流。對了,若是有說的不對的或者錯誤的地方,請你們指出來,我會努力改進,謝謝。ide

相關文章
相關標籤/搜索