不一定,但直接对空字符串或null调用explode()会返回['']或触发警告,易致逻辑错误;推荐用trim($str) === ''预检,preg_split()需PREG_SPLIT_NO_EMPTY过滤空项,str_split()对空字符串安全但不支持分隔符。
ex
plode() 前必须先判断源字符串是否为空?不一定,但直接对空字符串或 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', '']。
explode():后者无内置过滤,需配合 array_filter($arr),但要注意 array_filter() 默认也会删掉 '0'
'0',用 array_filter($arr, 'strlen') 或 array_filter($arr, function($v) { return $v !== ''; })
preg_split() 性能略低于 explode(),简单逗号分隔无需正则时,别为省一行代码换函数str_split() 和空字符串的关系str_split('', 1) 返回空数组 [],这是唯一一个 PHP 内置分割函数对空字符串“自然返回空结果”的情况。
但它只按字节/字符切分,不支持分隔符,所以和 explode() 不是替代关系。容易混淆的点在于名字带“split”,但用途完全不同。
str_split($str, ',') → 报 Warning:第二个参数必须是 intstr_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() 的默认行为。