← PHP中阿姆斯特朗数的判定:拆解数字与立方求和 PHP中斐波那契数列的两种实现:迭代与递归 →

PHP中回文数的判定:数字反转与比较

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

什么是回文数

回文数(Palindrome Number)指的是一个数字,将其各位数字反转后得到的新数字与原数字相同。简单说就是正着读和倒着读都一样。

常见的回文数例子:121、2332、12321、4884、567765。

验证一下12321:

  • 原数:12321

  • 反转后:12321

  • 两者相等,所以是回文数

需要留意的是,个位数(0-9)都是回文数,因为反转后还是它自己。这个特性在处理边界条件时可以用到。

核心实现逻辑

判定一个数字是否为回文数,基本的思路有两种:

方法一(数学方法):通过循环逐位取出数字,重新组合成反转后的数字,然后比较

  • 取出之后一位:$number % 10

  • 累加构建反转数:$reverse = $reverse * 10 + $remainder

  • 去掉之后一位:$number = floor($number / 10)

方法二(字符串方法):将数字转为字符串,直接用PHP内置函数反转字符串,然后比较

  • strrev() 函数直接反转字符串

  • 用 == 比较原字符串和反转后的字符串

个人经验:数学方法能帮你理解数字拆分的底层逻辑,字符串方法写起来更简洁。项目开发中我倾向于用字符串方法,因为代码可读性高,出错的概率也低。但面试时面试官可能希望你展示数学方法的思路,所以两种都应该掌握。

示例一:数学方法实现回文数判定

下面这段代码展示如何用循环取模的方式反转数字。

<?php  
function reverseNumber($n) {  
    $original = $n;  
    $reversed = 0;  
    
    while ($original > 0) {  
        $remainder = $original % 10;          // 取出之后一位
        $reversed = $reversed * 10 + $remainder;  // 构建反转数
        $original = (int)($original / 10);    // 去掉之后一位
    }  
    return $reversed;  
}  

$input = 1235321;  
$reversedNum = reverseNumber($input);  

if ($input == $reversedNum) {  
    echo "{$input} 是回文数";  
} else {  
    echo "{$input} 不是回文数";  
}  
?>

输出1235321 是回文数

关于上面代码的说明:函数内部用$original保存传入的值,避免直接修改参数。$reversed * 10这一步是为了把已有的反转数向左移动一位(十进制意义上的左移),然后再把新取出的个位数加在末尾。

示例二:字符串方法实现回文数判定(表单交互)

代码号学习编程中,用表单接收用户输入并结合strrev()函数是更简洁的做法。

<form method="post">        
    请输入一个数字:<input type="text" name="num"/>  
    <button type="submit">判断回文数</button>  
</form>  
<?php   
if ($_POST) {  
    $num = trim($_POST['num']);  
    
    // 输入验证:确保输入的是数字
    if (!is_numeric($num)) {  
        echo "请输入有效的数字";  
    } else {  
        // 注意:strrev对字符串操作,数字会自动转为字符串
        $reverse = strrev($num);  
        
        // 比较原数字和反转后的字符串
        // 注意这里用的是 == 而不是 ===,因为类型可能不同
        if ($num == $reverse) {  
            echo "数字 {$num} 是回文数";     
        } else {  
            echo "数字 {$num} 不是回文数";   
        }  
    }  
}     
?>

为什么这里不用 === 做全等比较$num来自表单提交,默认是字符串类型;strrev()返回的也是字符串。两者类型一致,用=====都可以。但如果$num前面有前导零(比如01210),is_numeric会认为是有效数字,但strrev反转后前导零会变成末尾零,比较结果就可能出问题。所以在项目中,如果要处理带前导零的输入,建议两端都显式转为字符串后再比较。

示例三:不借助函数手动反转字符串

如果想避免用strrev,也可以手动循环拼接字符串。这种方式在理解字符串操作上更有教学价值。

<?php
$num = "12321";
$length = strlen($num);
$reversed = "";

for ($i = $length - 1; $i >= 0; $i--) {
    $reversed .= $num[$i];   // 从后往前逐个拼接
}

if ($num == $reversed) {
    echo "{$num} 是回文数";
} else {
    echo "{$num} 不是回文数";
}
?>

本节课程知识要点

知识点 说明
数字反转的数学原理 反复用%10取余和/10取整,逐位构建反转数
strrev()函数 PHP内置字符串反转函数,处理数字时会自动做类型转换
类型转换注意事项 数字和字符串比较时PHP会做自动转换,要注意前导零的情况
边界条件 0-9都是回文数,负数通常不被视为回文数(负号反转后位置不对)

两种方法的对比

维度 数学方法 字符串方法
代码长度 较长
可读性 需要理解算法逻辑 直观
执行效率 略高(无类型转换开销) 略低(涉及字符串操作)
处理负数 负号会使结果异常 负号会使反转后位置错误
处理大数 可能溢出整数范围 无此问题

个人看法:在常规的网页表单场景中,优先用字符串方法。第一是代码简洁,第二是能直接处理很大的数字(不受PHP整数上限约束)。但数学方法的训练价值很高,它能帮助理解数字的位运算逻辑,对后面学习其他算法有铺垫作用。

常见问题与排查

问题1:输入121返回false

  • 检查循环条件:while($original > 0),正数都能正确进入循环。如果用了while($original)且$original变成浮点数后不为0,可能会导致无限循环

问题2:输入10返回true(错误的结果)

  • 分析:10反转后是"01",转为数字是1,不等于10。但如果用字符串比较,"10" != "01",实际会返回false。这个问题通常不会出现,除非比较逻辑写错了

问题3:输入负数为-121

  • 说明:回文数的定义通常只适用于非负整数。负号在反转后会跑到末尾(如-121反转后变成121-),结果肯定不相等。建议在函数开头加判断:if($n < 0) return false;

个人经验分享

我刚接触回文数判定时,习惯用数学方法,觉得这才算“真正的算法”。后来发现团队其他成员更习惯用字符串方法,代码评审时反而觉得数学方法需要多花时间理解。这个经历让我意识到:在团队协作中,代码的可读性有时候比“纯算法”更重要。如果是在性能敏感的底层模块,数学方法确实有它的优势。

另一个经验是:对于表单输入,不要假设用户一定会输入数字。加上is_numeric()校验是一个好习惯,不然用户输入字母时程序可能会报错,体验不好。

← PHP中阿姆斯特朗数的判定:拆解数字与立方求和 PHP中斐波那契数列的两种实现:迭代与递归 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号