You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将PHP数组格式化为JSON?附表格爬取代码求助

把PHP爬取的表格数组转成JSON的正确姿势

嗨,我来帮你搞定这个问题!从你的代码来看,你已经在通过DOM解析爬取外汇表格的单元格了,接下来只要把整理好的PHP数组转成JSON就行,我给你一步步说清楚:

第一步:先把爬取到的单元格整理成合理的数组结构

你现在的$result_rows是所有<td>节点的集合,直接塞数组会是一维的,得先把它们按表格行分组。比如假设你的外汇表格每行有4个单元格(常见的货币名称、现汇买入价这类列),可以这样调整:

$page = file_get_contents('https://www.jncb.com/Support/Help-Resources/Foreign-Exchange-Services');
$dom = new DOMDocument();
libxml_use_internal_errors(true); // 忽略HTML解析时的警告
$dom->loadHTML($page);
$xpath = new DOMXPath($dom);
$my_xpath_query = "//table//tbody[contains(@class, 'FxRContainer')]//td";
$result_rows = $xpath->query($my_xpath_query);

$data = [];
$currentRow = [];
$columnsPerRow = 4; // 这里根据你实际表格的列数调整,数清楚每行有几个<td>就行
$cellIndex = 0;

foreach ($result_rows as $cell) {
    // 清理单元格里的多余空格、换行符
    $cellValue = trim($cell->nodeValue);
    $currentRow[] = $cellValue;
    $cellIndex++;
    
    // 每凑够一行的列数,就把当前行加入$data数组
    if ($cellIndex % $columnsPerRow === 0) {
        $data[] = $currentRow;
        $currentRow = []; // 重置当前行,准备收集下一行
    }
}

// 处理最后一行可能不足列数的情况(如果表格总行数不是列数的整数倍)
if (!empty($currentRow)) {
    $data[] = $currentRow;
}

如果想让生成的JSON更易读(比如给每个字段加明确的键名),可以先定义表头,再对应赋值:

// 假设你的表格表头是:货币名称、现汇买入价、现钞买入价、现汇卖出价
$headers = ['currency', 'spot_buy', 'cash_buy', 'spot_sell'];
$data = [];
$currentRow = [];
$columnsPerRow = count($headers);
$cellIndex = 0;

foreach ($result_rows as $cell) {
    $cellValue = trim($cell->nodeValue);
    // 用表头作为键名,让数组结构更清晰
    $currentRow[$headers[$cellIndex % $columnsPerRow]] = $cellValue;
    $cellIndex++;
    
    if ($cellIndex % $columnsPerRow === 0) {
        $data[] = $currentRow;
        $currentRow = [];
    }
}

第二步:用json_encode()把数组转成JSON

PHP自带的json_encode()函数就能搞定转换,但搭配几个实用参数能让JSON更友好:

// 转换数组为JSON,参数组合保证中文不转Unicode、格式化输出
$jsonStr = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

// 检查转换是否出错
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON转换失败:" . json_last_error_msg();
} else {
    // 可以直接输出JSON(如果是接口返回的话)
    header('Content-Type: application/json');
    echo $jsonStr;
    
    // 或者保存到本地文件
    file_put_contents('exchange_rates.json', $jsonStr);
}

常用参数说明:

  • JSON_UNESCAPED_UNICODE:避免中文被转成\uXXXX这种Unicode编码,可读性拉满
  • JSON_PRETTY_PRINT:给JSON加上缩进和换行,方便调试查看
  • JSON_NUMERIC_CHECK:自动把数组里的数字字符串转成数字类型(比如汇率字符串转成float),如果需要可以加上这个参数

注意事项

  • 确保你的PHP数组里没有循环引用(比如数组元素引用了数组本身),否则json_encode()会返回false
  • 如果爬取的单元格内容有特殊字符,trim()能帮你清理掉多余的空格、换行、制表符,让数据更干净
  • 如果网站有反爬机制,file_get_contents()可能会被拦截,这时候可以考虑用cURL模拟浏览器请求

内容的提问来源于stack exchange,提问作者Xander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:12:21