explode
定义
explode 是 PHP 标准字符串函数库中的一个内置函数,签名形式为 explode(separator, string, limit),返回值为数组类型[1]。函数的语义是:以参数 separator 给出的字符串作为边界,把参数 string 切成若干片段,再按出现顺序放入返回的数组[1]。官方手册把这一行为概括为“按字符串分割字符串”[1]。
第二个参数是待处理的原始字符串,第一个参数则决定切割位置,两者的顺序不可互换[1]。第三个参数 limit 为可选,用来限制返回数组的元素个数,省略时默认取 PHP_INT_MAX,相当于不限制[3]。手册特别说明,尽管 implode 出于历史原因允许两种参数顺序,explode 从未支持过参数换位[1]。
原理
从执行过程看,explode 在原始字符串中查找分隔串首次出现的位置,把该位置之前的片段放入结果数组,然后从分隔串之后继续向后搜索,如此反复直到字符串末尾[2]。若某个分隔串在字符串中完全找不到,函数不会报错,而是返回只含 1 个元素的数组,该元素即原字符串本身[1]。若分隔串恰好位于字符串开头或结尾,切分后会在结果数组的首位或末位留下一个空字符串元素[1]。
limit 参数改变截断方式。取正数 $n$ 时,数组最多含 $n$ 项,剩余内容全部并入最后一项;取负数 $-n$ 时,返回的是去掉末尾 $n$ 项之后的部分;取 0 则按 1 处理[1]。下面的示意给出正负 limit 的差异:
$str = 'one|two|three|four';
explode('|', $str, 2) → ['one', 'two|three|four']
explode('|', $str, -1) → ['one', 'two', 'three']
手册注明该函数是二进制安全的,即字符串中出现空字节时不会截断切分结果,因此也可用于处理非文本数据[1]。
发展历程
explode 自 PHP 4 起即存在于标准函数集中,手册的版本标识把它列为适用于 PHP 4、PHP 5、PHP 7 和 PHP 8[1]。更早的 PHP 3 手册中已有同名函数条目,说明其接口在早期版本中就基本成型[4]。
可选参数 limit 是后续补充的功能。中文手册的更新日志显示,PHP 4.0.1 增加了 limit 参数,PHP 5.1.0 起支持负数的 limit[5]。
PHP 8.0.0 改变了异常处理方式:当 separator 传入空字符串时,函数改为抛出 ValueError,而在此之前它返回的是 false[1]。这一变更使错误更早暴露,也使返回类型在正常路径下稳定为数组。
应用
最常见的用法是把带固定分隔符的文本拆成数组,例如把空格分隔的句子拆成单词列表,或把以冒号分隔的系统账户行拆成多个字段,再配合 list 解构直接赋值给变量[1]。由于 PHP 中数组与字符串的互转非常频繁,该函数常与 implode 成对使用,一个负责拆分、一个负责拼回[2]。
正数 limit 在只需要前几个字段时很有用。手册示例中把 one|two|three|four 以 2 为上限切分,得到 ['one', 'two|three|four'],从而保留未被拆开的尾部内容[1]。负数 limit 则适合丢弃末尾若干无意义的片段,例如去掉末位空字段[5]。
局限
explode 只能按字面分隔串切分,分隔符本身不能是一个模式,因此处理不定数量的空白、多种可能的分隔字符或带引号转义的字段格式时并不适用,此类场景需要改用 正则表达式 分割函数 preg_split[1]。同样,它无法像 strtok 那样做流式的分词处理[1]。
空输入的处理容易引起误判。手册的用户注释指出,对空字符串调用 explode 仍会得到含 1 个空字符串元素的数组,而不是空数组,遇到未知输入时需要额外判断[1]。此外,分隔串在待处理字符串中不存在且 limit 为负数时,返回的是空数组,这一分支与常规返回不同[1]。
参数顺序固定也构成使用约束,写成 explode($str, ',') 这样的换位调用不会得到预期结果[1]。在 PHP 8.0 之前,传入空分隔串只会得到 false,代码若不检查类型直接当作数组使用,可能引发后续错误[5]。
参见
参考资料
- explode [引用日期2026-10-29]
- [PHP源码阅读]explode和implode函数 [引用日期2026-10-29]
- explode [引用日期2026-10-29]
- explode [引用日期2026-10-29]
- explode [引用日期2026-10-29]