explode在分隔符不存在时返回包含原字符串的单元素数组;例如explode(',', 'hello')返回['hello'],而非空数组。

explode 在分隔符不存在时返回什么?
当 explode 的分隔符在字符串中完全找不到,它不会返回空数组,而是返回一个只含原字符串的单元素数组。这是最常被误读的一点——很多人以为“没找到就切不出东西,所以是空数组”,实际恰恰相反。
例如:explode(',', 'hello') 返回 ['hello'],不是 [];explode('x', 'abc') 同样返回 ['abc']。
这个行为从 PHP 4 一直延续至今(包括 PHP 7.0、8.x),属于明确的文档定义行为,不是 bug。
为什么 explode('', $str) 会报 Warning 并返回 false?
PHP 明确禁止空字符串作为分隔符。在 PHP 7.0 中,explode('', 'abc') 会触发 Warning: explode(): Empty delimiter,并返回 false,而不是抛出异常或静默处理。
常见踩坑场景:
- 用户输入或配置项动态传入分隔符,未校验是否为空
- trim 后忘记检查结果是否为空:
explode(trim($sep), $str)当$sep是空格或制表符时,trim返回空串 - 从 JSON 或表单取值后直接使用,比如
$_POST['delimiter'] ?? ''
务必在调用前加判断:if ($sep === '') { /* 处理空分隔符逻辑 */ }。
explode 和 preg_split 在“找不到分隔符”时行为一致吗?
一致,但底层逻辑不同:两者都返回包含原字符串的数组。不过 preg_split 多一个陷阱——如果正则写错(比如未转义特殊字符),可能匹配失败却不报错,反而返回空数组或意外结果。
对比示例:
var_dump(explode('|', 'abc')); // ['abc']
var_dump(preg_split('/\|/', 'abc')); // ['abc']
var_dump(preg_split('/|/', 'abc')); // ['', 'a', '', 'b', '', 'c', ''] ← 错误正则,| 表示“或”,导致全字符分割
所以当需要正则能力时,优先确保模式正确;若只是固定分隔符,explode 更快、更安全、语义更清晰。
PHP 7.0 下 explode 性能与边界情况注意点
explode 是 C 实现的底层函数,性能远高于 preg_split,但在极端输入下仍有细节要注意:
- 输入字符串为
null时,PHP 7.0 会静默转成空字符串,即explode(',', null)等价于explode(',', '')→ 返回[''] - 输入是数字(如
explode(',', 123))会被强制转为字符串'123',结果是['123'] - 限制参数
$limit设为 0 时,等同于不设(PHP 7.0+ 已废弃负数限制,但 0 仍有效) - 不要依赖返回数组长度做“是否含分隔符”的判断:即使有分隔符,也可能因首尾空白产生空元素,比如
explode(',', ',,a,,')返回['', '', 'a', '', '']
真正可靠的判断方式是用 strpos($str, $delim) !== false,而不是看 count(explode(...))。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











