【问题标题】:Return Google Analytics Reporting API result as XML/JSON以 XML/JSON 格式返回 Google Analytics Reporting API 结果
【发布时间】:2018-08-18 11:18:24
【问题描述】:

不是 PHP 开发人员,但需要从Analytics Reporting API V4 using PHP 获取报告。如果有人可以帮助我将结果转换为 xml 或 json 格式,我将不胜感激。我无法将使用示例代码中的函数 printResults($reports) 检索到的结果插入数据库。谢谢!

【问题讨论】:

    标签: php json xml google-analytics google-analytics-api


    【解决方案1】:
    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]+;)/', '&amp;', $value);
    

    【讨论】:

      【解决方案2】:

      xml 的答案越来越长,所以我将单独放置 json 部分。 Json 可以更好地处理特殊字符,例如 '&'。如果您使用 SQL Server 2016 或更高版本,那么使用 OPENJSON 会容易得多。但是,我们有一个带有 SQL Server 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

      【讨论】:

        【解决方案3】:

        不知道为什么,但我在使用@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;
        
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-07
          • 1970-01-01
          • 1970-01-01
          • 2016-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-21
          相关资源
          最近更新 更多