PHP如何判断整型是否包含特定数字 PHP数字包含检测【速查】

5次阅读

php 8.0+ 应用 str_contains((String)$num, ‘7’) 判断整数是否含某数字,语义准确、性能最优、规避负数/零/溢出等边界问题;php 7.x 则用 strpos((string)$num, ‘7’) !== false。

PHP如何判断整型是否包含特定数字 PHP数字包含检测【速查】

str_contains() 最快最安全

PHP 8.0+ 直接转字符串查,比数学拆解快得多,也避开了负数、前导零、溢出等一边界问题。整型本身不“包含数字”,真正要的是“十进制表示里有没有某字符”,所以字符串匹配才是语义正确的做法。

  • str_contains((string)$num, '7') —— 简洁、可读、无副作用
  • 别用 strpos((string)$num, '7') !== false:多写且易漏 !== false0 也是合法位置)
  • 负数如 -42 转成字符串是 "-42",若不想匹配负号,先取绝对值:str_contains((string)abs($num), '4')
  • 注意:0 是有效整数,(string)0"0",能正常匹配

PHP 7.x 必须用 strpos() 模拟 str_contains()

低版本没 str_contains(),但不能退化成 strstr() 或正则——前者返回子串开销大,后者更重。就用 strpos(),只是务必用全等判断。

  • strpos((string)$num, '3') !== false —— 唯一推荐写法
  • 错例:if (strpos(...)):当目标数字在首位(如 512'5'),返回 0,被当成 false
  • 错例:strpos(...) !== -1:虽然等价,但 PHP 官方文档明确用 false 描述失败,保持一致更稳妥
  • 避免 in_array() 拆数组:把整数转成 digit 数组再查,性能差且代码臃肿

别碰数学拆解:%floor() 很容易翻车

有人想用取余、除法逐位提取数字,逻辑上可行,但实际几乎总是错的——尤其遇到 0、负数、PHP_int_MIN 这类边界值时行为反直觉。

  • 0:任何对 0 取余或除法操作都需单独判断,否则循环直接跳过
  • 负数:-123 % 10 在 PHP 中是 -3,不是 7,得额外处理符号
  • 大数:floor($num / 10) 对超大整数可能因浮点精度丢失最后几位(即使 $num 是 int)
  • 性能:字符串转换是 O(1) 内置操作;数学拆解是 O(log n),还要手动写循环

正则 preg_match() 不必要,除非你要复杂模式

单纯查“是否含某个数字”,正则纯属杀鸡用牛刀。它启动慢、编译开销固定、还引入 PCRE 依赖风险。

立即学习PHP免费学习笔记(深入)”;

  • 正确但冗余:preg_match('/7/', (string)$num)
  • 如果需求升级为“含两个连续 7”或“以 9 结尾”,再考虑正则
  • 注意:不要写 preg_match('/^7$/', ...)——这是匹配“整个数等于 7”,不是“包含 7”
  • 线上高频调用场景下,str_contains()preg_match() 快 3–5 倍(实测 PHP 8.2)

真正要注意的其实是隐式类型转换和负号处理——很多人只测了正数,上线后遇到 -10240 就漏匹配。字符串方案本身很简单,但得想清楚“你要的到底是数字字符,还是数值意义上的构成”。

text=ZqhQzanResources