Menu

PHP explode():把字符串分割成数组

explode(',', $string) 在每个逗号处分割字符串,并以数组形式返回各个片段。内容包括 limit 参数、按换行符分割、去掉片段两端的空白,以及什么时候 str_split 或 preg_split 更合适。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

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()。

Coddy 编程语言插图

和 Coddy 一起学编程

开始