拼接字符串時常產生尾部多餘分隔符:
$ids = [101, 102, 103];
$str = '';
foreach ($ids as $id) {
$str .= $id . ','; // 結果: "101,102,103,"
}
// 需移除最後的逗號
方案一:substr + strlen(傳統教科書式)
$result = substr($str, 0, strlen($str) - 1); // "101,102,103"
缺點:執行兩次函數調用、需計算長度、多字節字符串下 strlen 返回字節數而非字符數,易導致亂碼。
方案二:substr 負長度截取(簡潔版)
$result = substr($str, 0, -1); // 直接倒數第一個字符
優點:代碼極簡、單次函數調用。
風險:空字符串時返回空字符串(而非 false),但多字節編碼同樣有截半字符風險。
方案三:rtrim 精準移除指定字符(推薦)
$result = rtrim($str, ','); // 只移除尾部逗號,保留其他空白
核心優勢:
rtrim($str, ",;") 同時移除逗號和分號// 移除最後 4 個字符 "..." $str = "Hello World..."; echo substr($str, 0, -4); // "Hello World" // 移除尾部多種標點 $str = "Hello World!?.,"; echo rtrim($str, "!?.,"); // "Hello World"
// ❌ 錯誤:不修改原變量 rtrim($str, ','); echo $str; // 仍輸出 "101,102,103," // ✅ 正確:接收返回值 $str = rtrim($str, ','); echo $str; // "101,102,103"
$str = str_repeat('a,', 100000); // 20萬字符
$t = microtime(true);
for ($i=0; $i<1000; $i++) substr($str, 0, -1);
echo "substr: " . (microtime(true)-$t) . "s\n"; // ~0.08s
$t = microtime(true);
for ($i=0; $i<1000; $i++) rtrim($str, ',');
echo "rtrim: " . (microtime(true)-$t) . "s\n"; // ~0.06s
rtrim 略快且語義更清晰,推薦作為首選方案。
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 移除固定尾部字符(如逗號、分號) | rtrim($str, ',') | 語義精確、多字節安全、效能優 |
| 移除固定長度尾部(如後綴 "...", "...") | substr($str, 0, -N) | 精確控制字符數 |
| 移除尾部空白字符 | rtrim($str) | 內建支援空格、換行、制表符 |
| 複雜模式移除 | preg_replace('/,$/', '', $str) | 正則表達式最大靈活性 |