專案需求:將字串的指定區間(如第 5~15 字元)反轉,其餘保持原序。並需處理參數型別轉換、邊界檢查、負數與非數字輸入等邊界情況。
<?php
/**
* 字串區間反轉
*
* @param string $str 目標字串
* @param int|null $start 起始索引(0-based),null 表示從頭
* @param int|null $end 結束索引(不含),null 表示到尾
* @return string 處理後字串
*/
function reverseSection(string $str, ?int $start = null, ?int $end = null): string
{
$len = strlen($str);
// 參數預設值
$start ??= 0;
$end ??= $len;
// 邊界修正
$start = max(0, min($start, $len));
$end = max(0, min($end, $len));
if ($start > $end) {
// 交換或視為無效區間,這裡選擇交換
[$start, $end] = [$end, $start];
}
// 三段式組合:前段 + 反轉中段 + 後段
$prefix = substr($str, 0, $start);
$middle = strrev(substr($str, $start, $end - $start));
$suffix = substr($str, $end);
return $prefix . $middle . $suffix;
}
// === 測試案例 ===
$s = 'abcdefghijklmnopq';
var_dump(reverseSection($s)); // 全反轉
var_dump(reverseSection($s, 0, 10)); // 前 10 字元反轉
var_dump(reverseSection($s, 5, 15)); // 第 5~14 字元反轉
var_dump(reverseSection($s, '10', '15'));// 字串數字自動轉型
var_dump(reverseSection($s, 'df', 'sd'));// 非數字字串 → 0
var_dump(reverseSection($s, '的', '地方'));// 中文非數字 → 0
| 呼叫方式 | 結果 | 說明 |
|---|---|---|
reverseSection($s) | qponmlkjihgfedcba | 全字串反轉 |
reverseSection($s, 0, 10) | jihgfedcba klmnopq | 前 10 字元反轉(空格為示意) |
reverseSection($s, 5, 15) | abcde onmlkjih fgpq | 第 5~14 字元反轉 |
reverseSection($s, '10', '15') | 同 (10,15) | 字串數字自動 (int) 轉型 |
reverseSection($s, 'df', 'sd') | qponmlkjihgfedcba | 非數字 → 0,等同全反轉 |
?int 明確表達「可為 null」語意(PHP 7.1+)。max/min 確保索引落在 [0, $len] 區間。for 迴圈版本。(int)'abc' === 0,非數字字串一律歸零,符合 PHP 語意。function reverseSectionMb(string $str, ?int $start = null, ?int $end = null): string
{
$len = mb_strlen($str, 'UTF-8');
$start ??= 0;
$end ??= $len;
$start = max(0, min($start, $len));
$end = max(0, min($end, $len));
if ($start > $end) { [$start, $end] = [$end, $start]; }
$prefix = mb_substr($str, 0, $start, 'UTF-8');
$middle = mb_strrev(mb_substr($str, $start, $end - $start, 'UTF-8'), 'UTF-8');
$suffix = mb_substr($str, $end, null, 'UTF-8');
return $prefix . $middle . $suffix;
}
// 輔助函式:mb_strrev
function mb_strrev(string $str, string $encoding = 'UTF-8'): string
{
$chars = [];
for ($i = mb_strlen($str, $encoding) - 1; $i >= 0; $i--) {
$chars[] = mb_substr($str, $i, 1, $encoding);
}
return implode('', $chars);
}
本函式展示 PHP 字串操作的現代寫法:型別提示、null 安全、邊界修正、內建函式組合。實務上若涉及中文、表情符號等多位元組字元,請改用 mb_* 版本避免字元截斷錯誤。