PHP中explode()后json_encode()报错或为空,主因是编码非UTF-8、含BOM、空行或不可序列化类型;应先检测转换编码、trim和array_filter清理,多级分隔用str_getcsv,中文输出加JSON_UNESCAPED_UNICODE,大文本改用流式处理。
explode() 分割字符串后直接 json_encode() 报错或输出空数组常见现象是:原始文本用 explode() 切成数组后,json_encode() 返回 null 或空字符串。根本原因通常是数组里含非 UTF-8 编码字符(比如 GBK 的中文)、空行、BOM 头,或元素为 null/resource 等不可序列化类型。
实操建议:
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true) 检查源文本编码,非 UTF-8 就用
mb_convert_encoding($str, 'UTF-8', 'GBK') 转换trim($str) 去首尾空白,再用 array_filter($arr, 'strlen') 清掉空字符串元素explode() 结果裸调 json_encode(),加一层类型校验:$arr = array_map('trim', explode("\n", $text));
$arr = array_filter($arr, function($v) { return is_string($v) && $v !== ''; });
if (json_encode($arr) === false) {
error_log('JSON encode failed: ' . json_last_error_msg());
}str_getcsv() 比 explode() 更稳当文本含逗号、引号、换行等复杂内容(如 CSV 格式日志),硬用 explode(',', $line) 会切错字段——比如 "a,b",c,"d,e,f" 本该是 3 个字段,explode() 会拆成 5 个。
实操建议:
str_getcsv($line, ',', '"', '\\') 解析单行,它自动处理转义和包围符array_map('str_getcsv', array_filter(array_map('trim', explode("\n", $text))))
str_getcsv() 返回的数组元素默认是字符串,若需数字类型得手动转换,json_encode() 不会自动类型推断json_encode() 输出中文乱码?别漏掉 JSON_UNESCAPED_UNICODE
默认情况下 json_encode() 会把中文转成 \uXXXX 形式,前端拿到的是 Unicode 转义串,不是可读汉字。
实操建议:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
header('Content-Type: application/json; charset=utf-8');,避免浏览器误判编码stream_get_line() 流式处理几 MB 甚至上百 MB 的日志文本,一次性 explode("\n", $big_text) 会把整个字符串加载进内存,极易触发 Fatal error: Allowed memory size exhausted。
实操建议:
$fp = fopen('data.txt', 'r');
$result = [];
while (($line = stream_get_line($fp, 1024, "\n")) !== false) {
$line = trim($line);
if ($line) $result[] = $line;
}
fclose($fp);
echo json_encode($result, JSON_UNESCAPED_UNICODE);1024)防止某一行超长卡死;必要时用 fgets() 替代 stream_get_line() 兼容老版本 PHPyield 做生成器分批返回json_encode() 返回 null 却查不出原因。