首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 字串區間反轉函式:支援指定起始/結束位置的靈活實作

     編輯:PHP 相關知識

需求背景

專案需求:將字串的指定區間(如第 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,等同全反轉

關鍵技術點

  • nullable 型別提示:?int 明確表達「可為 null」語意(PHP 7.1+)。
  • null 合併運算子 ??:簡潔設定預設值。
  • 邊界防呆:max/min 確保索引落在 [0, $len] 區間。
  • 三段式組合:避免逐字元迴圈,效能優於原始碼的 for 迴圈版本。
  • 型別轉換行為:(int)'abc' === 0,非數字字串一律歸零,符合 PHP 語意。

進階擴充:支援 UTF-8 多位元組字串

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_* 版本避免字元截斷錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved