如何正确将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
相关产品推荐
相关产品推荐

