求助:非PHP开发者如何将Analytics Reporting API V4结果转XML/JSON并存库
解决PHP调用Analytics Reporting API V4结果转JSON/XML并存库的问题
嘿,我明白你不是PHP开发者,碰到这个确实有点头疼。别担心,咱们一步步来,把printResults($reports)输出的内容转成结构化的JSON或XML,然后存进数据库。
首先,原有的printResults函数是直接把结果打印到页面上,咱们得先把这些数据从API返回的$reports对象里提取出来,整理成PHP数组——这样转成JSON或XML就简单多了。
第一步:把报表数据转成PHP数组
先写一个函数,遍历API返回的报表对象,把表头、行数据都整理成数组:
function parseReportToArray($reports) { $resultData = []; foreach ($reports as $reportIndex => $report) { $reportData = [ 'id' => $reportIndex, 'columnHeaders' => [], 'rows' => [] ]; // 提取表头信息(比如维度、指标名称和类型) if ($report->getColumnHeaders()) { foreach ($report->getColumnHeaders() as $header) { $reportData['columnHeaders'][] = [ 'name' => $header->getName(), 'type' => $header->getColumnType() ]; } } // 提取每一行的维度和指标值 if ($report->getData()->getRows()) { foreach ($report->getData()->getRows() as $row) { // 获取指标值 $metricValues = $row->getMetrics()[0]->getValues(); // 获取维度值(如果有的话) $dimensions = $row->getDimensions(); // 把维度和指标合并成一行数据 if (!empty($dimensions)) { $reportData['rows'][] = array_merge($dimensions, $metricValues); } else { $reportData['rows'][] = $metricValues; } } } $resultData[] = $reportData; } return $resultData; }
调用这个函数就能得到结构化的数组:
// 假设你已经通过API获取到了$reports对象 $reportArray = parseReportToArray($reports);
第二步:转成JSON格式
有了数组之后,用PHP自带的json_encode就能直接转成JSON字符串,非常方便:
// JSON_PRETTY_PRINT是为了让JSON格式更易读,可选 $jsonString = json_encode($reportArray, JSON_PRETTY_PRINT);
现在$jsonString就是标准的JSON格式,直接存数据库就行。
第三步:转成XML格式
如果需要XML,咱们可以用PHP的SimpleXMLElement来构建:
function convertReportToXML($reportArray) { // 创建根节点 $xml = new SimpleXMLElement('<analyticsReports></analyticsReports>'); foreach ($reportArray as $report) { $reportNode = $xml->addChild('report'); $reportNode->addAttribute('id', $report['id']); // 添加表头节点 $headersNode = $reportNode->addChild('columnHeaders'); foreach ($report['columnHeaders'] as $header) { $headerNode = $headersNode->addChild('columnHeader'); $headerNode->addChild('name', htmlspecialchars($header['name'])); $headerNode->addChild('type', htmlspecialchars($header['type'])); } // 添加行数据节点 $rowsNode = $reportNode->addChild('rows'); foreach ($report['rows'] as $row) { $rowNode = $rowsNode->addChild('row'); foreach ($row as $index => $value) { // 用表头的名称作为节点名,没有的话就用索引 $columnName = $report['columnHeaders'][$index]['name'] ?? "value_$index"; $rowNode->addChild($columnName, htmlspecialchars($value)); } } } return $xml->asXML(); } // 调用生成XML字符串 $xmlString = convertReportToXML($reportArray);
第四步:存入数据库
接下来把JSON/XML字符串存进数据库,这里用PDO举个例子(比mysqli更安全):
// 替换成你的数据库信息 $dbHost = 'localhost'; $dbName = 'your_database'; $dbUser = 'your_username'; $dbPass = 'your_password'; try { // 建立数据库连接 $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 插入JSON数据(假设你的表叫analytics_reports,有report_json和created_at字段) $stmt = $pdo->prepare("INSERT INTO analytics_reports (report_json, created_at) VALUES (:json_data, NOW())"); $stmt->bindParam(':json_data', $jsonString); $stmt->execute(); // 如果要存XML,把上面的SQL改成对应的字段就行: // $stmt = $pdo->prepare("INSERT INTO analytics_reports (report_xml, created_at) VALUES (:xml_data, NOW())"); // $stmt->bindParam(':xml_data', $xmlString); // $stmt->execute(); echo "数据已成功存入数据库!"; } catch(PDOException $e) { echo "数据库错误: " . $e->getMessage(); }
小提示:
- 数据库字段建议用
TEXT或LONGTEXT类型(如果存JSON,MySQL 5.7+可以用JSON类型,方便后续查询); - 如果你的报表数据特别大,记得检查数据库字段的长度限制;
- 上面的代码里已经处理了特殊字符(比如
htmlspecialchars),避免XML或数据库出现格式问题。
内容的提问来源于stack exchange,提问作者Weihui Guo
相关产品推荐
相关产品推荐

