PHP 怎么把字符串按分隔符拆成数组?附 3 种方法

编程狮(w3cschool.cn) 2026-08-19 16:00:05 浏览数 (67)
反馈

PHP 怎么把字符串拆成数组

你在写 PHP 时,是不是经常拿到一串用逗号隔开的字符串,比如「苹果,香蕉,橙子」,却不知道怎么把它变成一个个独立元素?PHP字符串处理是日常开发中最高频的操作之一,而把一段文本拆成PHP数组,是最基础也最容易踩坑的环节。拆字符串最简单的方法,是使用 explode 函数:给它一个分隔符和一个原字符串,它就直接返回一个数组。本文基于 PHP 8 验证,把 explode、str_split、preg_split 三种字符串分割方式一次讲清,并附上横向对比和常见坑点。今天这篇文章,编程狮就把 PHP 分割字符串这件事讲透。

一、先搞清楚:我们要解决什么

很多时候,数据是以「一段文字」的形式进来的,而不是现成的数组。比如:

  • 表单里一个多选框,提交上来是 "1,3,5" 这样的字符串;
  • 接口返回的标签是 "后端,前端,运维"
  • 一行 CSV 数据是用逗号隔开的;
  • 配置文件里写的是 "jpg,png,gif",你需要拆开后逐个检查扩展名。

这些场景的共同点:原始数据是一串文本,但你需要的却是能遍历、能索引的结构。你的目标,是把这一长串变成 PHP 里的数组,这样就能用 foreach 逐个处理、用 count() 知道有几个元素、用下标直接取第几个。在动手前,建议先过一遍 PHP 教程 里数组和字符串的基础章节,后面会顺很多。

二、方案一:explode() 按分隔符拆成数组(最常用)

explode() 是日常用得最多的拆分函数。它接收三个参数:分隔符、原字符串,以及可选的「最多拆几段」。

$str = "苹果,香蕉,橙子";
$arr = explode(",", $str);
print_r($arr);
// 输出:Array ( [0] => 苹果 [1] => 香蕉 [2] => 橙子 )

上面这段里,explode(",", $str) 用逗号把原字符串切开,返回一个索引数组。如果你想限制段数,可以加第三个参数:

$str = "a,b,c,d";
$arr = explode(",", $str, 2);
print_r($arr);
// 输出:Array ( [0] => a [1] => b,c,d )

第三个参数 2 表示最多拆成 2 段,多出来的部分会整体塞进最后一段。这个特性在「只取第一段,其余原样保留」的场景下很有用,比如解析日志时只关心第一列是时间戳,后面的内容不需要再拆。

explode() 返回的永远是 PHP 数组,哪怕原字符串里找不到分隔符,它也会返回一个只含原字符串本身的单元素数组。这个行为后面会专门说——它是新手最容易忽略的坑。

三、方案二:str_split() 按固定长度切分

如果你的字符串没有「分隔符」,而是想每 N 个字符切一刀,就用 str_split()。它按长度切,而不是按符号。

$str = "123456";
$arr = str_split($str, 2);
print_r($arr);
// 输出:Array ( [0] => 12 [1] => 34 [2] => 56 )

这个函数适合处理「定长格式」的数据,比如每两位代表一个含义的编号。注意它切的是「字符」不是「字节」,对中文等多字节字符要小心,避免把一个字从中间切开变成乱码。如果你的项目涉及中文按长度切分,应该改用 mb_str_split(),它会按完整的字符而非字节来切,不会出现半个汉字的情况。

str_split() 不传第二个参数时,默认按 1 个字符切,相当于把字符串逐字拆成数组。这在需要逐字符遍历时很方便,但同样要注意多字节字符的问题。

四、方案三:preg_split() 按正则拆分

当分隔符不固定、甚至出现多种时,比如「逗号、顿号、空格」混着来,普通 explode() 就不够用了,这时用 preg_split() 配合正则表达式。

$str = "苹果, 香蕉、橙子";
$arr = preg_split("/[,、]\s*/", $str);
print_r($arr);
// 输出:Array ( [0] => 苹果 [1] => 香蕉 [2] => 橙子 )

上面这段里,正则 /[,、]\s*/ 表示「遇到逗号或顿号,后面跟着的空白也一起吃掉」。这样无论分隔符混用还是带了空格,都能干净地拆开。正则写错了容易匹配不到或匹配过多,不确定时先用小数据测试。想系统学正则,这篇 PHP 正则表达式 讲得更完整。

五、三种方法横向对比与坑点

把三种方式摆在一起看,选择就清晰了:

方法 按什么拆 适合场景 常见坑
explode() 单个分隔符 逗号/竖线隔开的数据 分隔符不存在时返回单元素数组
str_split() 固定长度 定长编号、流水号 多字节字符会被切断
preg_split() 正则表达式 多种分隔符混用 正则写错导致拆不干净

⚠️ 注意:当原字符串里根本没有你指定的分隔符时,explode() 不会报错,而是返回一个只有原字符串本身的数组。如果你的逻辑假设「一定拆成了多段」,这里就可能埋下 bug,记得先判断数组长度。

实际开发中还有一个高频坑:分隔符本身包含特殊含义的字符。比如用 explode(".") 拆 IP 地址是没问题的,因为 explode 把第一个参数当普通字符串;但如果你误用 preg_split 时忘了转义点号,正则里的 . 会匹配任意字符,结果就完全不对。记住一个原则:explode 不涉及正则,传什么就按什么拆;preg_split 的第一个参数是正则,特殊字符要转义。

函数名和参数记不准时,PHP 速查手册 可以直接翻,省得来回切换页面。

PHP 三种字符串拆分方法对比表

总结

把字符串拆成数组,最常用的是 explode():给它分隔符和原串就返回数组;没有分隔符、要按长度切用 str_split();分隔符不固定、多种混用则用 preg_split()

要点带走:

  • explode() 按单个分隔符拆,最直观也最常用;
  • str_split() 按固定长度切,小心多字节字符被切断;
  • preg_split() 靠正则,适合复杂分隔场景;
  • 拆之前先判断分隔符是否真的存在,避免拿到单元素数组还当多段用。

下一步,建议把这三种拆法放到你自己的小练习里各写一遍,体会它们返回数组的差异,以后遇到字符串处理会更顺手。

延伸学习

想把 PHP 基础打得更牢,可以按这个路径来:

  1. 函数参数和写法记不住时,PHP 速查手册放在手边随时查;
  2. 字符串、数组、正则这三块想系统补齐,跟着 PHP 零基础入门课程 边学边练,比零散查文档更连贯;
  3. 基础扎实后,PHP 进阶篇 能用更多实践把语法用熟。

常见问题

Q:explode 的分隔符找不到时会怎样?
A:不会报错,而是返回一个只含原字符串本身的数组,长度为 1。如果你的代码假设一定能拆成多段,这里容易出 bug,建议先用 count() 判断数组长度。

Q:str_split 切中文为什么会乱码?
A:因为它按「字符」切而不是按「字节」,但中文在 UTF-8 里占多个字节,按长度切可能把一个字从中间断开。处理中文不要用它按长度切,改用按分隔符或 mb_ 系列函数。

Q:分隔符是竖线 | 时 explode 要转义吗?
A:不需要。竖线在 explode 的第一个参数里只是普通字符,直接写 explode("|", $str) 即可;只有用到 preg_split 的正则时,竖线才有特殊含义,那时才需要转义。

Q:想把拆出来的数组再拼回去怎么办?
A:用 implode()(别名 join()),语法和 explode 正好相反:implode(",", $arr) 会把数组用逗号连回字符串。

0 人点赞