在格式化輸出、生成固定寬度代碼、對齊日誌欄位等場景中,常需在字符串首尾重複填充特定字符。本文提供兩個輕量級函數 str_prefix()、str_suffix(),支援自定義填充字符與次數,並對比內建 str_pad() 的差異。
<?php
/**
* 字符串左側填充(前綴)
* @param string $str 原字符串
* @param int $n 填充次數
* @param string $char 填充字符,預設空格
* @return string
*/
function str_prefix($str, $n = 1, $char = ' ') {
for ($x = 0; $x < $n; $x++) {
$str = $char . $str;
}
return $str;
}
/**
* 字符串右側填充(後綴)
* @param string $str 原字符串
* @param int $n 填充次數
* @param string $char 填充字符,預設空格
* @return string
*/
function str_suffix($str, $n = 1, $char = ' ') {
for ($x = 0; $x < $n; $x++) {
$str = $str . $char;
}
return $str;
}
// 測試
echo str_prefix('test', 3, '-'); // ---test
echo "\n";
echo str_suffix('test', 3, '-'); // test---
?>
<?php
$str = 'test';
// 左填充至長度 10
echo str_pad($str, 10, '-', STR_PAD_LEFT); // ------test
// 右填充至長度 10
echo str_pad($str, 10, '-', STR_PAD_RIGHT); // test------
// 兩側填充
echo str_pad($str, 10, '-', STR_PAD_BOTH); // ---test---
// 指定填充字符串(多字符循環)
echo str_pad($str, 10, 'ab', STR_PAD_LEFT); // ababatest
?>
| 特性 | str_prefix / str_suffix | str_pad() |
|---|---|---|
| 控制維度 | 填充次數 | 目標總長度 |
| 填充對象 | 單字符 | 字符串(循環使用) |
| 方向控制 | 分兩函數 | STR_PAD_LEFT/RIGHT/BOTH |
| 性能 | 循環拼接,大量填充較慢 | C 級實現,極快 |
| 適用場景 | 已知次數、單字符、簡單邏輯 | 對齊輸出、固定寬度、多字符模式 |
<?php
// 1. 生成固定長度訂單號:前綴 0 補齊 8 位
$orderId = 123;
$orderNo = str_pad($orderId, 8, '0', STR_PAD_LEFT); // 00000123
// 2. 日誌欄位對齊:左對齊 20 字符
$label = 'USER_LOGIN';
$logLine = str_pad($label, 20, ' ', STR_PAD_RIGHT) . ' | ' . date('Y-m-d H:i:s');
/* 輸出:
USER_LOGIN | 2024-01-15 10:30:45
*/
// 3. 簡單模板佔位:前綴 $
$price = 99;
echo '$' . str_pad($price, 6, '0', STR_PAD_LEFT); // $000099
// 4. 自定義函數場景:已知需加 3 個星號前綴
$secret = 'password';
echo str_prefix($secret, 3, '*'); // ***password
?>
str_pad() 或 str_repeat($char, $n) . $str 避免循環拼接開銷。str_repeat() 內部優化,單次分配內存,效率遠高於循環 .=。str_prefix/str_suffix 適合教學演示、極簡邏輯;生產代碼中優先使用 str_pad()、str_repeat() 等內建函數,代碼更簡潔、性能更優、功能更全。