<?php
$str = "Hello World";
echo strrev($str); // dlroW olleH
?>
C 層實作,效能最佳、支援多位元組(配合 mb_strrev 或轉碼)。
<?php
$str = "Hello World";
$rev = "";
for ($i = strlen($str) - 1; $i >= 0; $i--) {
$rev .= $str[$i];
}
echo $rev;
?>
每次串接都重新分配記憶體,長字串極慢(O(n²))。
<?php
$str = "Hello World";
$arr = [];
for ($i = strlen($str) - 1; $i >= 0; $i--) {
$arr[] = $str[$i];
}
echo implode('', $arr);
?>
單次記憶體分配,O(n),但額外陣列開銷。
<?php
$str = "Hello World";
$len = strlen($str);
$half = (int)ceil($len / 2);
for ($i = 0; $i < $half; $i++) {
$j = $len - 1 - $i;
// 交換 $str[$i] 和 $str[$j]
$tmp = $str[$i];
$str[$i] = $str[$j];
$str[$j] = $tmp;
}
echo $str;
?>
ceil():無條件進位,ceil(5/4)=2$str[0], $str[1]...n/2 vs n),理論效能提升 2 倍| 方法 | 相對時間 | 記憶體 |
|---|---|---|
strrev() | 1.0x (基準) | 低 |
| 二分法交換 | ~3.5x | 低 |
| 陣列+implode | ~5x | 中 |
| 迴圈串接 | ~50x+ | 高 |
<?php
// 錯誤:逐位元組反轉會破壞 UTF-8
$str = "中文測試";
echo strrev($str); // 亂碼
// 正確:轉為字元陣列再反轉
function mb_strrev($str) {
$chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
return implode('', array_reverse($chars));
}
echo mb_strrev("中文測試"); // 試測文中
?>
strrev()(ASCII)或上述 mb_strrev()(UTF-8).=),改用陣列收集或內建函數