我清楚的記得,是誰在我耳邊說:「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地址徹底夠用了。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表格的庫類有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