不一定,但直接对空字符串或null调用explode()会返回['']或触发警告,易致逻辑错误;推荐用trim($str) === ''预检,preg_split()需PREG_SPLIT_NO_EMPTY过滤空项,str_split()对空字符串安全但不支持分隔符。

用 explode() 前必须先判断源字符串是否为空?
不一定,但直接对空字符串或 null 调用 explode() 会返回 [''](含一个空元素的数组),而非空数组。这常导致后续 foreach 或 count() 逻辑出错——比如误判“有数据”。
常见错误现象:explode(',', '') 返回 [''],count() 是 1;explode(',', null) 触发 Notice(PHP 8.1+ 为 Warning)。
- 推荐做法:用
trim($str) === ''或!isset($str) || $str === ''预检,再决定是否explode() - 注意
empty($str)会把'0'、'false'等“falsy 字符串”也判为空,不适用于需保留数字零的场景 - 若确定输入来自表单且允许空白,优先用
trim($str) !== ''更安全
preg_split() 能自动过滤空片段吗?
可以,但默认不会。关键在 PREG_SPLIT_NO_EMPTY 标志位。
例如:preg_split('/,/', ',a,,b,', -1, PREG_SPLIT_NO_EMPTY) 返回 ['a', 'b'],跳过所有空项;而不用该标志时返回 ['', 'a', '', 'b', '']。
立即学习“PHP免费学习笔记(深入)”;
- 对比
explode():后者无内置过滤,需配合array_filter($arr),但要注意array_filter()默认也会删掉'0' - 如需保留
'0',用array_filter($arr, 'strlen')或array_filter($arr, function($v) { return $v !== ''; }) -
preg_split()性能略低于explode(),简单逗号分隔无需正则时,别为省一行代码换函数
PHP 8.0+ 中 str_split() 和空字符串的关系
str_split('', 1) 返回空数组 [],这是唯一一个 PHP 内置分割函数对空字符串“自然返回空结果”的情况。
但它只按字节/字符切分,不支持分隔符,所以和 explode() 不是替代关系。容易混淆的点在于名字带“split”,但用途完全不同。
- 误用场景:想按逗号拆却写了
str_split($str, ',')→ 报 Warning:第二个参数必须是 int - 真正需要按长度切分时,
str_split($str, $len)对空字符串安全,无需预检 - 若要兼容多字节(如中文),得用
mb_str_split()(PHP 7.4+),它对空字符串同样返回[]
为什么 array_filter(explode()) 在某些情况下仍不保险?
因为 array_filter() 默认使用“truthy/falsy”判断,'0'、'0.0'、'false' 全被当空过滤掉——这不是分割逻辑的问题,而是语义丢失。
比如处理 CSV 中的 ID 列:explode(',', '123,0,456') 得到 ['123','0','456'],加 array_filter() 后变成 ['123','456'],ID 就错了。
- 正确写法:
array_values(array_filter($arr, function($v) { return $v !== ''; })) - 更简洁:用
array_diff($arr, ['']),但注意它不重排键名,需套array_values() - 终极建议:空值检测逻辑应与业务一致——是“真空白”还是“有意义的零”?别让分割函数替你做业务判断
empty() 的隐式类型转换,以及 array_filter() 的默认行为。











