我清楚的記得,是誰在我耳邊說:「PHP是世界上最好的語言」,反正我可沒說哈(理不直氣還壯),我就聽過這種言論,畢竟我膽小,哪裏敢在公衆場合說這種話,關於「誰是最好語言的言論」,很早以前,就在IT界掀起過多場血雨腥風的爭論都無果,我們就不要再搞事了,老老實實搬磚……php
好了,蝦扯蛋完畢,開始說點正事,我後續會陸續寫一些PHP開發中實用的一些自定義函數,方便用到的朋友,可以快速開發和使用。html
咱們在開發過程當中,總會遇到一些顯示時間的問題,有的時候須要顯示年-月-日
,有的時候須要顯示年-月-日 時.分.秒
,在每次遇到使用的時候,都會重複的寫着一行相似date($time, 'Y-m-d H:i:s')
的代碼,想不想有一個更加優雅的寫法呢,那就是自定義一個函數,就是下面定義的函數,使用的時候,若是時間格式是默認的,那麼直接調用函數time_format($time)
傳入時間戳就能夠了,是否是感受這種看着就舒服一點呢?segmentfault
/** * 返回格式化時間 * @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)
就搞定了!api
/** * 返回格式化數字 * @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地址 * @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表格的庫類有PHPExcel
等,可是,想不想不借助任何庫類,能直接導出Excel表格數據呢,固然是有辦法的,那就是直接利用html
的table
表格來生成表格數據並導出。網絡
/** * 導出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