17370845950

php分割文本转JSON输出_php分割数组json_encode转JSON【步骤】
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 等不可序列化类型。

实操建议:

  • 先用 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)
  • 如果还乱码,检查 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

实操建议:

  • 改用文件流方式逐行读取:
    $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 却查不出原因。