前言
PHP 內建超過 1000 個函數,掌握高頻核心函數是高效開發的關鍵。本文按功能分類整理實戰常用函數,附帶參數說明與最佳實踐。
一、日期時間處理
| 需求 | 函數/寫法 | 範例輸出 | 備註 |
| 當前日期時間 | date('Y-m-d H:i:s') | 2024-01-15 14:30:45 | 格式字符見下表 |
| 時間戳轉日期 | date('Y-m-d', $timestamp) | 2024-01-15 | |
| 日期字串轉時間戳 | strtotime('2024-01-15 14:30:00') | 1705319400 | 支援相對時間 |
| 相對時間計算 | strtotime('+1 week') | 下週同時間戳 | 'next Monday', 'last day of this month' |
| 微秒級時間 | microtime(true) | 1705319445.1234 | 效能測量必備 |
| DateTime 物件 (推薦) | (new DateTime())->format('c') | 2024-01-15T14:30:45+08:00 | 時區安全、鏈式操作 |
| 時區處理 | date_default_timezone_set('Asia/Taipei') | — | 腳本最開頭設定 |
date() 格式字符速查
Y - 4位年份 y - 2位年份
m - 月份(01-12) n - 月份(1-12) M - 縮寫月名 F - 完整月名
d - 日(01-31) j - 日(1-31) D - 縮寫週名 l - 完整週名
H - 24時(00-23) h - 12時(01-12) i - 分(00-59) s - 秒(00-59)
a - am/pm A - AM/PM
c - ISO 8601 r - RFC 2822 U - Unix 時間戳
二、檔案引入與自動載入
| 語句 | 行為 | 失敗後果 | 適用場景 |
require | 編譯階段引入 | 致命錯誤 | 核心依賴、配置檔 |
require_once | 僅引入一次 | 致命錯誤 | 類定義、函數庫 |
include | 執行階段引入 | 警告 | 模板、可選模組 |
include_once | 僅引入一次 | 警告 | 共用片段 |
現代專案請使用 Composer PSR-4 自動載入,避免手動 require。
三、輸出與格式化
| 函數 | 用途 | 範例 |
echo | 直接輸出,可多參數 | echo 'A', 'B'; |
print | 輸出單值,返回 1 | print 'Hello'; |
printf | 格式化輸出 | printf('%.2f', 3.14159); → 3.14 |
sprintf | 格式化返回字串 | $sql = sprintf("SELECT * FROM %s WHERE id=%d", 'users', 1); |
var_dump | 結構化除錯輸出 | 含類型、長度 |
print_r | 陣列/物件可讀輸出 | print_r($arr, true) 返回字串 |
json_encode | 編碼 JSON | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES |
常用格式化佔位符
%s 字串
%d 有號整數
%f 浮點數 (預設 6 位小數)
%.2f 保留 2 位小數
%x 十六進位小寫
%08x 8 位十六進位前導零
四、字串操作核心函數
| 分類 | 函數 | 說明 | 範例 |
| 長度/編碼 | strlen | 位元組長度 | strlen('中文') === 6 (UTF-8) |
mb_strlen | 字符長度 (需 mbstring) | mb_strlen('中文', 'UTF-8') === 2 |
mb_internal_encoding | 設定內部編碼 | mb_internal_encoding('UTF-8') |
| 大小寫 | strtolower/strtoupper | ASCII 範圍 | 不支援多位元組 |
mb_strtolower/mb_strtoupper | Unicode 安全 | 指定編碼參數 |
ucfirst/ucwords | 首字/各詞首字大寫 | ucwords('hello world') |
| 查找/替換 | strpos/strrpos | 位置 (0-based, false=未找到) | if (strpos($hay, $needle) !== false) |
stripos | 不分大小寫 | |
str_replace | 替換所有 (區分大小寫) | str_replace(['{name}'], [$name], $tpl) |
str_ireplace | 不分大小寫替換 | |
| 切分/合併 | explode | 字串→陣列 | explode(',', 'a,b,c') |
implode | 陣列→字串 | implode(',', $arr) |
preg_split | 正則切分 | preg_split('/\s+/', $str) |
| 截取/修飾 | substr | 位元組截取 | substr('abcdef', 2, 3) → 'cde' |
mb_substr | 字符截取 | 支援負索引 |
trim/ltrim/rtrim | 去除首尾字符 | trim($str, "\x00..\x1F") 去控制字符 |
| 編碼轉換 | mb_convert_encoding | 編碼轉換 | mb_convert_encoding($str, 'UTF-8', 'BIG5') |
| HTML 實體 | htmlspecialchars | 防 XSS 必備 | htmlspecialchars($str, ENT_QUOTES, 'UTF-8') |
| 格式化數字 | number_format | 千分位、小數位 | number_format(1234.5, 2, '.', ',') → '1,234.50' |
五、陣列操作大全
建立與基本屬性
$arr = ['k0' => 'a', 'k1' => 'b', 'k2' => 'c'];
count($arr); // 3
array_keys($arr); // ['k0','k1','k2']
array_values($arr); // ['a','b','c'] (重新索引)
array_key_exists('k1', $arr); // true
in_array('b', $arr); // true (值搜尋)
指標操作 (內部指標)
current($arr); // 'a'
next($arr); // 'b'
prev($arr); // 'a'
end($arr); // 'c'
reset($arr); // 'a'
key($arr); // 當前鍵
each($arr); // ['key'=>'k0','value'=>'a',0=>'k0',1=>'a'] 並前進
增刪改 (修改原陣列)
| 函數 | 操作 | 返回值 | 鍵名行為 |
array_push | 尾部推入 | 新長度 | 數字鍵遞增 |
array_pop | 尾部彈出 | 彈出值 | — |
array_unshift | 頭部推入 | 新長度 | 數字鍵重排,字串鍵不變 |
array_shift | 頭部彈出 | 彈出值 | 數字鍵重排 |
array_splice | 切片替換 | 被移除元素 | 可插入/刪除/替換 |
排序 (全部修改原陣列,返回 bool)
| 函數 | 排序依據 | 鍵名保留 |
sort | 值升序 | 否 (重排 0...) |
rsort | 值降序 | 否 |
asort | 值升序 | 是 |
arsort | 值降序 | 是 |
ksort | 鍵升序 | 是 |
krsort | 鍵降序 | 是 |
natsort | 自然排序 | 是 |
shuffle | 隨機打亂 | 否 |
進階操作 (返回新陣列,不修改原陣列)
array_merge($a, $b); // 合併 (數字鍵重排,字串鍵後蓋前)
array_combine($keys, $values); // 鍵值組合成關聯陣列
array_slice($arr, 2, 3); // 切片 (保留鍵名需第4參數 true)
array_chunk($arr, 2, true); // 分塊
array_unique($arr); // 去重 (保留首次出現鍵名)
array_filter($arr, fn($v)=>$v>0); // 過濾
array_map(fn($v)=>$v*2, $arr); // 映射
array_reduce($arr, fn($c,$v)=>$c+$v, 0); // 歸約求和
array_column($users, 'name'); // 提取欄位
array_keys($arr, 'value'); // 反向搜尋鍵名
陣列運算
$a + $b; // 聯集 (左優先保留鍵名)
array_diff($a, $b); // 差集 (值比較)
array_intersect($a, $b); // 交集 (值比較)
array_diff_key($a, $b); // 鍵名差集
六、JSON 處理最佳實踐
$data = ['id' => 1, 'name' => '中文', 'tags' => ['a', 'b']];
// 編碼
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR);
// {"id":1,"name":"中文","tags":["a","b"]}
// 解碼為關聯陣列 (推薦)
$arr = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
// 解碼為物件
$obj = json_decode($json, false, 512, JSON_THROW_ON_ERROR);
// $obj->name
// 錯誤處理 (PHP 7.3+ JSON_THROW_ON_ERROR 拋出 JsonException)
try {
$data = json_decode($invalidJson, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
log_error('JSON 解析失敗: ' . $e->getMessage());
}
七、效能微優化提醒
isset($arr['key']) 比 array_key_exists('key', $arr) 快 (語言結構 vs 函數)
in_array 大陣列 O(n);頻繁查找請改 isset($lookup[$val]) 或 array_flip 後查鍵
array_push($arr, $v) 比 $arr[] = $v 慢 (函數調用開銷)
- 大量字串拼接用
implode 或 sprintf,避免循環 .=
- 啟用 OPcache,預編譯腳本大幅降低函數調用開銷
結語
熟練運用核心函數是 PHP 開發者的基本功。建議將本文作為桌邊速查,遇到陌生函數優先查閱 PHP 官方手冊,注意版本差異與棄用提醒。