函數簡介
str_pad() 是 PHP 內建的字串填充函數,可將字串補齊至指定長度。常用於:會員卡號、訂單編號、發票號碼、員工工號等需要固定位數的編號生成。
語法與參數
str_pad(string $string, int $length, string $pad_string = " ", int $pad_type = STR_PAD_RIGHT): string
| 參數 | 說明 |
$string | 必需。原始字串 |
$length | 必需。目標長度。若小於原字串長度則不處理 |
$pad_string | 選填。填充字元,預設為空白。可為多字元字串 |
$pad_type | 選填。填充方向常數 |
填充方向常數
| 常數 | 行為 | 適用場景 |
STR_PAD_LEFT | 左側填充(最常用) | 編號補零、對齊輸出 |
STR_PAD_RIGHT | 右側填充(預設) | 文字靠左對齊 |
STR_PAD_BOTH | 兩側填充,右側優先 | 標題置中裝飾 |
核心範例:生成 10 位數會員卡號
<?php
$cardCount = 10;
$cards = [];
for ($i = 1; $i <= $cardCount; $i++) {
// 關鍵:STR_PAD_LEFT 在左側補 0
$cardNo = str_pad($i, 10, '0', STR_PAD_LEFT);
$cards[] = $cardNo;
}
print_r($cards);
/* 輸出:
Array
(
[0] => 0000000001
[1] => 0000000002
[2] => 0000000003
[3] => 0000000004
[4] => 0000000005
[5] => 0000000006
[6] => 0000000007
[7] => 0000000008
[8] => 0000000009
[9] => 0000000010
)
*/
?>
進階應用場景
1. 訂單編號:日期 + 流水號
<?php
function generateOrderNo($seq) {
$datePart = date('Ymd'); // 20241219
$seqPart = str_pad($seq, 6, '0', STR_PAD_LEFT); // 000001
return $datePart . $seqPart; // 20241219000001
}
// 使用 Redis 原子計數器確保流水號唯一
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$seq = $redis->incr('order_seq:' . date('Ymd'));
echo generateOrderNo($seq);
?>
2. 發票號碼:字軌 + 8 碼數字
<?php
function generateInvoiceNo($track, $number) {
return strtoupper($track) . str_pad($number, 8, '0', STR_PAD_LEFT);
}
// 輸出:AB12345678
echo generateInvoiceNo('ab', 12345678);
?>
3. 固定寬度表格輸出(CLI 報表)
<?php
$products = [
['id' => 1, 'name' => '筆記型電腦', 'price' => 35000],
['id' => 2, 'name' => '滑鼠', 'price' => 500],
['id' => 3, 'name' => '機械鍵盤', 'price' => 2800],
];
// 表頭
echo str_pad('ID', 4, ' ', STR_PAD_RIGHT) . ' | ' .
str_pad('商品名稱', 12, ' ', STR_PAD_RIGHT) . ' | ' .
str_pad('價格', 10, ' ', STR_PAD_LEFT) . PHP_EOL;
echo str_repeat('-', 35) . PHP_EOL;
// 資料列
foreach ($products as $p) {
echo str_pad($p['id'], 4, ' ', STR_PAD_RIGHT) . ' | ' .
str_pad($p['name'], 12, ' ', STR_PAD_RIGHT) . ' | ' .
str_pad(number_format($p['price']), 10, ' ', STR_PAD_LEFT) . PHP_EOL;
}
/* 輸出:
ID | 商品名稱 | 價格
-----------------------------------
1 | 筆記型電腦 | 35,000
2 | 滑鼠 | 500
3 | 機械鍵盤 | 2,800
*/
?>
4. 多字元填充字串
<?php
// 使用「-=」作為填充字元,長度 20
echo str_pad('CHAPTER 1', 20, '-=', STR_PAD_BOTH);
// 輸出:-=-=-CHAPTER 1-=-=-
?>
常見陷阱與注意事項
- 長度不足不截斷:若
$length < strlen($string),函數直接回傳原字串,不會截斷
- 多位元組字元:中文字元在 UTF-8 下佔 3 位元組,
strlen() 計算的是位元組數非字元數,可能導致視覺寬度不符。CLI 報表建議使用 mb_strlen() 搭配手動計算
- 填充字串長度 > 1:會重複填充字串直到達長度,最後可能被截斷
替代方案比較
| 方法 | 優點 | 缺點 | 適用場景 |
str_pad() | 內建、支援多方向、多字元填充 | 多位元組字元視覺寬度問題 | 純數字/英文編號補零 |
sprintf('%010d', $num) | 格式化功能強、效能佳 | 僅限數字、不支援字串前綴 | 純數字流水號 |
str_repeat('0', 10 - strlen($num)) . $num | 邏輯直觀 | 需手動處理長度判斷 | 簡單場景 |
NumberFormatter (intl) | 支援多國語系、格式化規則豐富 | 需安裝 intl 擴展、較重 | 國際化專案 |
總結
str_pad() 是處理固定長度編號的利器,搭配 STR_PAD_LEFT 和 '0' 填充字元,能輕鬆實現卡號、訂單號、發票號的自動補零。實務上建議封裝為工具函式,統一管理編號規則,並注意多位元組字元的視覺寬度問題。