17370845950

php判断字符串长度用explode分割测_php分割后数组长度法【要点】
用 explode() 测字符串长度是错误的,因其返回的是分割后的段落数而非字符数;正确方法是:字节长度用 strlen(),多字节字符长度(如中文、emoji)必须用 mb_strlen($s, 'UTF-8')。

explode() 测字符串长度是错的

想通过 explode() 分割再取数组长度来判断原字符串“有多长”,本质混淆了「字符数」和「段落数」。比如 explode(',', 'a,b,c') 得到 3 个元素,但原字符串长度是 5;中间有连续逗号('a,,b')时,结果更不可靠——默认会忽略空段,除非显式传第三个参数。

strlen()mb_strlen() 才是正解

测字节长度用 strlen(),测字符长度(尤其含中文、emoji)必须用 mb_strlen() 并指定编码,否则多字节字符会被算成多个字节。常见错误是直接对 UTF-8 字符串调 strlen(),返回值比实际“看起来的长度”大。

  • strlen('你好') → 返回 6(UTF-8 下每个汉字占 3 字节)
  • mb_strlen('你好', 'UTF-8') → 返回 2
  • 不传编码参数时,mb_strlen() 依赖 mb_internal_encoding() 当前值,线上环境可能不一致,务必显式传 'UTF-8'

explode() 后取 count() 的真实用途

它只适合统计「以某分隔符切分出的非空逻辑单元数量」,比如 CSV 行字段数、路径层级、标签列表项数。但前提是:分隔符明确、数据格式可控。

  • 要兼容空段,必须加第三个参数:count(explode(',', $s, -1))(PHP 7.4+ 支持负数限制,保留末尾空项)
  • 分隔符本身是正则或含特殊字符(如点、星号),别硬套 explode(),改用 preg_split()
  • 性能上,explode()mb_substr() 或正则快,但仅限于单字节分隔符且无需编码感知的场景

容易被忽略的边界情况

空字符串、全分隔符字符串、超长字符串在不同 PHP 版本下行为略有差异,尤其涉及内存和 max_input_vars 限制时。

  • explode(',', '') 返回 ['']count()1,不是 0
  • explode(',', ',,') 默认返回 ['', '', '']?错——实际是 ['', ''](末尾空串被丢弃),只有加 -1 才得 3 个
  • 超过 memory_limit 时,explode() 可能静默失败或触发 Fatal error: Allowed memory size exhausted,而 strlen() 几乎无开销
真正需要长度就调 mb_strlen(),别绕路。分割后数数

组只是数“块”,不是量“尺”。