PHP中explode()后json_encode()报错或为空,主因是编码非UTF-8、含BOM、空行或不可序列化类型;应先检测转换编码、trim和array_filter清理,多级分隔用str_getcsv,中文输出加JSON_UNESCAPED_UNICODE,大文本改用流式处理。

PHP 用 explode() 分割字符串后直接 json_encode() 报错或输出空数组
常见现象是:原始文本用 explode() 切成数组后,json_encode() 返回 null 或空字符串。根本原因通常是数组里含非 UTF-8 编码字符(比如 GBK 的中文)、空行、BOM 头,或元素为 null/resource 等不可序列化类型。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先用
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 个。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 优先用
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 转义串,不是可读汉字。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 必须显式传参:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) - 如果还乱码,检查 PHP 文件本身是否保存为 UTF-8 无 BOM 格式(尤其 Windows 记事本容易带 BOM)
- 输出前加
header('Content-Type: application/json; charset=utf-8');,避免浏览器误判编码
大文本分割后内存溢出?用 stream_get_line() 流式处理
几 MB 甚至上百 MB 的日志文本,一次性 explode("\n", $big_text) 会把整个字符串加载进内存,极易触发 Fatal error: Allowed memory size exhausted。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 改用文件流方式逐行读取:
$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()兼容老版本 PHP - 不追求一次性全量 JSON 输出,可配合
yield做生成器分批返回
json_encode() 返回 null 却查不出原因。











