explode($separator, $string) 在每个 $separator 出现的地方分割字符串,并以数组形式返回各个片段。explode(',', 'apple,banana,cherry') 得到 ['apple', 'banana', 'cherry']。
分隔符可以是任意字符串,不限于单个字符:explode(' and ', 'tea and milk and sugar') 的用法完全一样。相反的操作,即把数组重新连接成字符串,是 implode()。
语法和返回值
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
它总是返回数组。如果分隔符没有出现,数组里只有一个元素,就是整个字符串。空字符串也是如此,它会得到一个只含一个空字符串的数组,这常常导致“输入为空时循环仍然执行了一次”的 bug。
限制片段数量
第三个参数 $limit 决定你得到多少个片段:
- 正数 limit 最多返回这么多个片段。最后一个片段包含字符串的剩余部分,其中的分隔符也会保留。
- 负数 limit 返回除最后
abs($limit)个片段之外的所有片段。 - limit 为
0时按1处理。
只关心第一个分隔符时,正数 limit 正合适,比如值里也可能含有 = 的 key=value 行:explode('=', 'query=a=b', 2) 得到 ['query', 'a=b']。后面几节就是这样用的。
如果只要最后一个片段,先把数组存进变量:$parts = explode('/', $path); $file = end($parts);。写成 end(explode('/', $path)) 仍会返回正确的值,但 PHP 会输出 Notice: Only variables should be passed by reference,因为 end() 按引用接收参数。
按换行符分割字符串
explode("\n", $text) 在换行处分割。要用双引号:在单引号中,'\n' 是一个反斜杠加字母 n,而不是换行符。来自 Windows 文件或 HTML 表单的文本行尾常常是 "\r\n",这会在每个片段末尾留下多余的 "\r"。preg_split('/\R/', $text) 能在任何类型的换行处分割。
去掉片段两端的空白并丢弃空片段
像 "red, green , ,blue" 这样的用户输入,各项周围有空格,中间还有一个空项。用 array_map() 让每个片段经过 trim(),再用 array_filter() 移除空字符串。之后用 array_values() 重新编号键,因为 array_filter() 会保留原来的键。
回调 fn($c) => $c !== '' 会保留字符串 "0"。直接写 array_filter($colors) 会把它丢掉,因为 "0" 是假值。
把字符串转换成关联数组
设置项、cookie 和类似查询字符串的内容,常常以 key=value 对的形式存储。分割两次:第一次拆出各个键值对,第二次对每个键值对用 limit 2 分割,再把两个片段解构到变量中(数组解构)。
不含 = 的键值对(比如 debug)会得到只有一个元素的数组,解构时会输出 Warning: Undefined array key 1。把结果补足到两个元素就能避免:[$key, $value] = explode('=', $pair, 2) + [1 => ''];。
对于真正的 URL 查询字符串,parse_str() 会替你完成这些工作,还会解码 %20 和 +。
按多个分隔符分割
explode() 只接受一个分隔符。要在逗号、分号或空格处分割,用带字符类的 preg_split()。连续两个分隔符会产生空片段,PREG_SPLIT_NO_EMPTY 会把它们丢掉。
中文、日文等 UTF-8 文本
explode() 按字节比较,而在 UTF-8 中,一个完整字符永远不会出现在另一个字符的字节里,所以用 、 或全角逗号这样的分隔符拆分中文或日文文本,都能得到正确的结果。
explode、str_split 与 preg_split 的区别
| 函数 | 分割依据 | 示例 | 结果 |
|---|---|---|---|
explode() | 固定的分隔符字符串 | explode('-', '2026-03-14') | ['2026', '03', '14'] |
str_split() | 每 N 个字节 | str_split('abcdef', 2) | ['ab', 'cd', 'ef'] |
mb_str_split() | 每 N 个字符 | mb_str_split('日本語') | ['日', '本', '語'] |
preg_split() | 正则表达式 | preg_split('/\s+/', 'a b') | ['a', 'b'] |
explode() 不做任何正则处理,所以比 preg_split() 快;只要分隔符是固定字符串,就优先用它。
常见错误:空分隔符
空分隔符是错误。从 PHP 8.0 起,explode('', 'abc') 会抛出 ValueError,而不是返回 false,脚本随之终止:
PHP Fatal error: Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3
要把字符串拆成单个字符,ASCII 文本用 str_split('abc'),可能含有多字节字符的文本用 mb_str_split($s)。
常见问题
PHP 中 explode() 有什么作用?
它在每个分隔符出现的地方分割字符串,并以数组形式返回各个片段:explode(',', 'a,b,c') 返回 ['a', 'b', 'c']。分隔符本身不会出现在任何片段中。
找不到分隔符时 explode() 返回什么?
返回只有一个元素的数组,这个元素就是整个字符串:explode(',', 'apple') 返回 ['apple']。空字符串会得到 [''],即包含一个空字符串的数组,所以 count() 返回 1 而不是 0。
PHP 中怎么用多个分隔符分割字符串?
用带字符类的 preg_split():preg_split('/[,;|]/', $s) 会在逗号、分号和竖线处分割。如果还要丢掉空片段,传入 limit -1 和相应标志:preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY)。
explode() 和 str_split() 有什么区别?
explode() 在你指定的分隔符处分割。str_split($s, 3) 把字符串切成固定长度的块,长度按字节计算。中文、日文等多字节文本要用 mb_str_split($s),它按字符计算。
为什么 explode() 会抛出 ValueError?
因为分隔符是空字符串。从 PHP 8.0 起,explode('', $s) 会抛出 ValueError: explode(): Argument #1 ($separator) cannot be empty。要把字符串拆成单个字符,用 str_split() 或 mb_str_split()。