← PHP中数字反转的两种方法:数学算法与字符串函数 PHP中变量交换的两种实现方式:借助临时变量与算术运算 →

PHP中字符串反转的两种实现方式:内置函数与手动循环

原创 2026-05-21 PHP 已有人查阅

什么是字符串反转

字符串反转(String Reversal)指的是将一个字符串中字符的顺序颠倒过来。例如,字符串"HELLO"反转后变成"OLLEH","PHP编程"反转后变成"程编PHP"。

这个操作在很多实际场景中会用到,比如判断回文字符串、数据格式转换、某些加密算法的预处理等。

核心实现逻辑

实现字符串反转主要有两条思路:

方法一(使用内置函数):PHP提供了strrev()函数,专门用于反转字符串,一行代码即可完成。

方法二(手动循环):获取字符串长度,从之后一个字符开始往前遍历,逐个拼接到新字符串中。

手动实现能帮助你理解字符串在计算机中的存储方式——字符串可以通过下标访问每一个字符,类似于数组。

示例一:使用strrev()函数反转字符串

代码号学习编程中,用内置函数实现反转是最快捷的方式。

<?php  
$text = "CODELEARN";  
echo "原字符串:{$text}<br>";  
echo "反转后的结果:" . strrev($text);  
?>

输出

原字符串:CODELEARN
反转后的结果:NRAELEDOC

strrev()函数的特点

  • 参数只接受字符串类型,传入其他类型会自动转换

  • 对多字节字符(如中文)处理存在问题,原因后面会说明

  • 执行效率较高,因为是C语言层面实现的

个人经验:在确定字符串只包含ASCII字符(英文、数字、常见符号)的情况下,直接用strrev()没问题。但如果项目需要处理用户输入的中文内容,这个函数就不太适用了。

示例二:不使用strrev()函数手动反转

下面演示如何通过循环手动实现字符串反转。这种方法能让你更清楚底层的处理逻辑。

<?php  
$text = "CODELEARN";  
$length = strlen($text);   // 获取字符串长度
$reversed = "";            // 用于存放反转后的结果

// 从之后一个字符开始,向前遍历
for ($i = $length - 1; $i >= 0; $i--) {  
    $reversed .= $text[$i];   // 将当前字符拼接到结果末尾
}  

echo "原字符串:{$text}<br>";
echo "手动反转结果:{$reversed}";
?>

输出

原字符串:CODELEARN
手动反转结果:NRAELEDOC

关于下标访问:PHP中可以用$string[$index]的方式直接访问字符串中的某个字符,$index从0开始。$text[0]是第一个字符C,$text[8]是之后一个字符N。

为什么要从$length - 1开始:因为长度为9的字符串,之后一个字符的下标是8,所以循环的起始值是$length - 1

本节课程知识要点

知识点 说明
strrev()函数 PHP内置字符串反转函数,仅支持单字节字符
strlen()函数 获取字符串的字节长度,不是字符个数
字符串下标访问 $string[$index] 方式获取指定位置的字符
循环拼接 从后向前遍历,用 .= 操作符逐个拼接字符
多字节字符问题 中文等UTF-8字符占多个字节,需用mb_系列函数

两种方法的对比

维度 strrev()函数 手动循环
代码量 1行 4-5行
执行速度 较快 较慢(PHP层面循环)
ASCII字符 正常 正常
中文字符 乱码 乱码(原因相同)
学习价值 了解内置函数 理解字符串本质
可读性 直接明了 需要理解循环逻辑

中文字符串反转的正确处理方式

上面两种方法在处理中文时都会出问题,因为UTF-8编码下一个中文字符占用3个字节。strrev()和手动按字节反转都会把中文字符拆碎,导致输出乱码。

正确做法:使用mb_substr()按字符逐个提取。

<?php  
function mb_strrev($string, $encoding = 'UTF-8') {  
    $length = mb_strlen($string, $encoding);  
    $reversed = '';  
    for ($i = $length - 1; $i >= 0; $i--) {  
        $reversed .= mb_substr($string, $i, 1, $encoding);  
    }  
    return $reversed;  
}  

$text = "编程学习";  
echo "原字符串:{$text}<br>";
echo "正确反转结果:" . mb_strrev($text);  // 输出:习学程编
?>

涉及的多字节字符串函数

  • mb_strlen():获取多字节字符串的字符个数

  • mb_substr():按字符位置截取,不会破坏多字节字符

  • 需要PHP启用mbstring扩展(多数环境默认已启用)

常见问题与排查

问题1:反转后中文显示为乱码

  • 原因:使用了strrev()或按字节遍历

  • 解决:改用mb_substr()按字符处理

问题2:手动循环时下标越界报错

  • 原因:循环条件写成$i > 0而不是$i >= 0,漏掉了第一个字符

  • 解决:确保循环包含下标0

问题3:字符串包含空格或特殊符号

  • 说明:strrev()和手动循环都能正确处理空格和常见符号

  • 示例:"Hello World" 反转后为 "dlroW olleH"(空格位置也会反转)

问题4strrev()处理数字字符串

  • 说明:数字字符串会被当作普通字符串处理

  • 示例:strrev("12345") 返回 "54321"

个人经验分享

在项目中选择哪种方法,我一般这样判断:

  • 如果确定只处理英文或数字,直接用strrev(),简单可靠

  • 如果需要处理中文等多字节字符,就用自定义的mb_strrev()函数

  • 教学或面试场景下,手动循环更考察基本功

另外有一个容易被忽略的问题:用户输入的内容可能包含换行符\n或制表符\t,这些控制字符在反转后位置也会改变。如果后续需要保持原始格式,就要提前考虑清楚。

关于性能:strrev()是C函数,处理几十万字符的字符串也很快。手动循环在PHP层面逐个拼接,字符串越长性能差距越明显。所以项目开发中能用内置函数的地方,我个人倾向于直接用内置函数,除非有特殊需求。

← PHP中数字反转的两种方法:数学算法与字符串函数 PHP中变量交换的两种实现方式:借助临时变量与算术运算 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号