Return Google 分析报告 API 结果为 XML/JSON
Return Google Analytics Reporting API result as XML/JSON
不是 PHP 开发人员,但需要从 Analytics Reporting API V4 using PHP 获得报告。如果有人可以帮助我将结果转换为 xml 或 json 格式,我将不胜感激。我无法将使用示例代码中的函数 printResults($reports) 检索到的结果插入到数据库中。谢谢!
Google_Service_AnalyticsReporting_GetReportsResponse Object
(
[collection_key:protected] => reports
[reportsType:protected] => Google_Service_AnalyticsReporting_Report
[reportsDataType:protected] => array
[internal_gapi_mappings:protected] => Array
(
)
[modelData:protected] => Array
(
[reports] => Array
(
[0] => Array
(
[columnHeader] => Array
(
[dimensions] => Array
(
[0] => ga:dimension9
[1] => ga:campaign
[2] => ga:source
[3] => ga:medium
[4] => ga:keyword
[5] => ga:adContent
)
[metricHeader] => Array
(
[metricHeaderEntries] => Array
(
[0] => Array
(
[name] => organicSearches
[type] => INTEGER
)
)
)
)
[data] => Array
(
[rows] => Array
(
[0] => Array
(
[dimensions] => Array
(
[0] => 1000342194.1520628512
[1] => (not set)
[2] => google
[3] => organic
[4] => (not provided)
[5] => (not set)
)
以上是print_r($response)的结果;基于对象,我使用以下函数以 XML 格式打印响应:
function printResultsAsXml($response) {
$array = $response['reports'];
$arrayHeaders = ($array[0]['columnHeader']['dimensions']);
$arrayRows = $array[0]['data']['rows'];
$mdarray = array();
for ( $rowIndex = 0; $rowIndex < count($arrayRows); $rowIndex++) {
$mdarray[] = array_combine($arrayHeaders, $arrayRows[$rowIndex]['dimensions']);
}
// print_r(xmlutils::array_to_xml($mdarray));
$output = xmlutils::array_to_xml($mdarray);
header('content-type: text/xml');
$doc = new DOMDocument();
$doc->loadXML($output, LIBXML_NOXMLDECL);
echo $doc->saveXML();
}
下面是 XML 中的结果。我是PHP的新手,所以如果你碰巧知道更好的答案,请告诉我。
<data>
<data-item>
<gadimension9>1000342194.1520628512</gadimension9>
<gacampaign>(not set)</gacampaign>
<gasource>google</gasource>
<gamedium>organic</gamedium>
<gakeyword>(not provided)</gakeyword>
<gaadContent>(not set)</gaadContent>
</data-item>
<data-item>
<gadimension9>1000401494.1520637016</gadimension9>
<gacampaign>(not set)</gacampaign>
<gasource>google</gasource>
<gamedium>organic</gamedium>
<gakeyword>(not provided)</gakeyword>
<gaadContent>(not set)</gaadContent>
</data-item>
</data>
xmlutils.php 由 Jeremy Pyne 编写,用于将数组转换为 xml。
如果代码抛出这样的错误:
DOMDocument::loadXML(): xmlParseEntityRef: no name in Entity.
这很可能是由于“&”字符造成的,应予以替换。我根据这个 question 的答案在 xmlutils.php 中添加了一行。
$value=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $value);
xml 的答案越来越长,所以我将把 json 部分分开。 Json 更好地处理“&”等特殊字符。如果您使用 SQL 服务器 2016 或更高版本,那么使用 OPENJSON 会容易得多。但是,我们有一个带有 SQL 服务器 2014 的远程服务器,所以我必须使用 xml.
function printResultsAsJson($reports) {
$darray = array();
$marray = array();
$mkey = array();
for ($reportIndex = 0; $reportIndex < count($reports); $reportIndex++) {
$report = $reports[$reportIndex];
$header = $report->getColumnHeader();
$dimensionHeaders = $header->getDimensions();
$metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries();
$rows = $report->getData()->getRows();
for ($j = 0; $j < count($metricHeaders); $j++) {
$entry = $metricHeaders[$j];
$mkey[] = $entry->getName();
}
for ($rowIndex = 0; $rowIndex < count($rows); $rowIndex++) {
$row = $rows[$rowIndex];
$dimensions = $row->getDimensions();
$metrics = $row->getMetrics();
$darray[] = array_combine($dimensionHeaders, $dimensions);
for ($j = 0; $j < count($metrics); $j++) {
$values = $metrics[$j]->getValues();
$marray[] = array_combine($mkey, $values);
}
}
}
$i = 0;
$mdarray = array();
foreach($darray as $value) {
$mdarray[] = array_merge($value, $marray[$i]);
$i++;
}
print_r(json_encode($mdarray));
}
更新:之前的答案只获取维度,这个可以获取指标并将 2 个多维数组合并为一个 - PHP: Merge 2 Multidimensional Arrays。
不知道为什么,但我在使用@kakugiki 的函数时遇到了一些有趣的错误——数组大小不等,还有其他问题。
如果其他人对那个有有趣的结果,我重写了这个,这对我的目的来说似乎非常可靠。
public function result($reports)
{
$rows=[];
foreach($reports as $report) {
$header = $report->getColumnHeader();
$dimensionHeaders = $header->getDimensions();
$metricHeaderEntries = $header->getMetricHeader()->getMetricHeaderEntries();
$rows = array_merge($rows, $report->getData()->getRows());
}
foreach($metricHeaderEntries as $metricHeaderEntry) {
$metricHeaders[] = $metricHeaderEntry->getName();
}
$headers = array_merge($dimensionHeaders, $metricHeaders);
foreach($rows as $row) {
$metrics = [];
$dimensions = $row->getDimensions();
$metricEntries = $row->getMetrics();
foreach($metricEntries as $metricEntry) {
$metrics = array_merge($metrics, $metricEntry->getValues());
}
$results[] = array_combine($headers, array_merge($dimensions, $metrics));
}
return $results;
}
不是 PHP 开发人员,但需要从 Analytics Reporting API V4 using PHP 获得报告。如果有人可以帮助我将结果转换为 xml 或 json 格式,我将不胜感激。我无法将使用示例代码中的函数 printResults($reports) 检索到的结果插入到数据库中。谢谢!
Google_Service_AnalyticsReporting_GetReportsResponse Object
(
[collection_key:protected] => reports
[reportsType:protected] => Google_Service_AnalyticsReporting_Report
[reportsDataType:protected] => array
[internal_gapi_mappings:protected] => Array
(
)
[modelData:protected] => Array
(
[reports] => Array
(
[0] => Array
(
[columnHeader] => Array
(
[dimensions] => Array
(
[0] => ga:dimension9
[1] => ga:campaign
[2] => ga:source
[3] => ga:medium
[4] => ga:keyword
[5] => ga:adContent
)
[metricHeader] => Array
(
[metricHeaderEntries] => Array
(
[0] => Array
(
[name] => organicSearches
[type] => INTEGER
)
)
)
)
[data] => Array
(
[rows] => Array
(
[0] => Array
(
[dimensions] => Array
(
[0] => 1000342194.1520628512
[1] => (not set)
[2] => google
[3] => organic
[4] => (not provided)
[5] => (not set)
)
以上是print_r($response)的结果;基于对象,我使用以下函数以 XML 格式打印响应:
function printResultsAsXml($response) {
$array = $response['reports'];
$arrayHeaders = ($array[0]['columnHeader']['dimensions']);
$arrayRows = $array[0]['data']['rows'];
$mdarray = array();
for ( $rowIndex = 0; $rowIndex < count($arrayRows); $rowIndex++) {
$mdarray[] = array_combine($arrayHeaders, $arrayRows[$rowIndex]['dimensions']);
}
// print_r(xmlutils::array_to_xml($mdarray));
$output = xmlutils::array_to_xml($mdarray);
header('content-type: text/xml');
$doc = new DOMDocument();
$doc->loadXML($output, LIBXML_NOXMLDECL);
echo $doc->saveXML();
}
下面是 XML 中的结果。我是PHP的新手,所以如果你碰巧知道更好的答案,请告诉我。
<data>
<data-item>
<gadimension9>1000342194.1520628512</gadimension9>
<gacampaign>(not set)</gacampaign>
<gasource>google</gasource>
<gamedium>organic</gamedium>
<gakeyword>(not provided)</gakeyword>
<gaadContent>(not set)</gaadContent>
</data-item>
<data-item>
<gadimension9>1000401494.1520637016</gadimension9>
<gacampaign>(not set)</gacampaign>
<gasource>google</gasource>
<gamedium>organic</gamedium>
<gakeyword>(not provided)</gakeyword>
<gaadContent>(not set)</gaadContent>
</data-item>
</data>
xmlutils.php 由 Jeremy Pyne 编写,用于将数组转换为 xml。
如果代码抛出这样的错误:
DOMDocument::loadXML(): xmlParseEntityRef: no name in Entity.
这很可能是由于“&”字符造成的,应予以替换。我根据这个 question 的答案在 xmlutils.php 中添加了一行。
$value=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $value);
xml 的答案越来越长,所以我将把 json 部分分开。 Json 更好地处理“&”等特殊字符。如果您使用 SQL 服务器 2016 或更高版本,那么使用 OPENJSON 会容易得多。但是,我们有一个带有 SQL 服务器 2014 的远程服务器,所以我必须使用 xml.
function printResultsAsJson($reports) {
$darray = array();
$marray = array();
$mkey = array();
for ($reportIndex = 0; $reportIndex < count($reports); $reportIndex++) {
$report = $reports[$reportIndex];
$header = $report->getColumnHeader();
$dimensionHeaders = $header->getDimensions();
$metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries();
$rows = $report->getData()->getRows();
for ($j = 0; $j < count($metricHeaders); $j++) {
$entry = $metricHeaders[$j];
$mkey[] = $entry->getName();
}
for ($rowIndex = 0; $rowIndex < count($rows); $rowIndex++) {
$row = $rows[$rowIndex];
$dimensions = $row->getDimensions();
$metrics = $row->getMetrics();
$darray[] = array_combine($dimensionHeaders, $dimensions);
for ($j = 0; $j < count($metrics); $j++) {
$values = $metrics[$j]->getValues();
$marray[] = array_combine($mkey, $values);
}
}
}
$i = 0;
$mdarray = array();
foreach($darray as $value) {
$mdarray[] = array_merge($value, $marray[$i]);
$i++;
}
print_r(json_encode($mdarray));
}
更新:之前的答案只获取维度,这个可以获取指标并将 2 个多维数组合并为一个 - PHP: Merge 2 Multidimensional Arrays。
不知道为什么,但我在使用@kakugiki 的函数时遇到了一些有趣的错误——数组大小不等,还有其他问题。
如果其他人对那个有有趣的结果,我重写了这个,这对我的目的来说似乎非常可靠。
public function result($reports)
{
$rows=[];
foreach($reports as $report) {
$header = $report->getColumnHeader();
$dimensionHeaders = $header->getDimensions();
$metricHeaderEntries = $header->getMetricHeader()->getMetricHeaderEntries();
$rows = array_merge($rows, $report->getData()->getRows());
}
foreach($metricHeaderEntries as $metricHeaderEntry) {
$metricHeaders[] = $metricHeaderEntry->getName();
}
$headers = array_merge($dimensionHeaders, $metricHeaders);
foreach($rows as $row) {
$metrics = [];
$dimensions = $row->getDimensions();
$metricEntries = $row->getMetrics();
foreach($metricEntries as $metricEntry) {
$metrics = array_merge($metrics, $metricEntry->getValues());
}
$results[] = array_combine($headers, array_merge($dimensions, $metrics));
}
return $results;
}