【问题标题】:Dynamically add different sized data sets to Google Visulation Chart将不同大小的数据集动态添加到 Google 可视化图表
【发布时间】:2015-08-25 01:30:19
【问题描述】:

我使用 simpleXML 遍历数据。我正在寻找一种灵活的方式来遍历数据以绘制谷歌图表。请记住,Google Chart 的列数在任何阶段都会有所不同。

下面是我试图在图表上绘制的数据示例。

<dealers>
  <dealer>
    <dealer>Sydney</dealer>
    <sales>265</sales>
    <year>2015 FY</year>
  </dealer>
  <dealer>
    <dealer>Sydney</dealer>
    <sales>218</sales>
    <year>2016 FY</year>
  </dealer>
  <dealer>
    <dealer>Melbourne</dealer>
    <sales>143</sales>
    <year>2016 FY</year>
  </dealer>
  <dealer>
    <dealer>Brisbane</dealer>
    <sales>181</sales>
    <year>2016 FY</year>
  </dealer>
</dealers>

我怎样才能循环通过它来生成下面的图表来绘制图表?

var data = google.visualization.arrayToDataTable([
                  ['Year', 'Sydney', 'Melbourne', 'Brisbane'],
                  ['2015 FY', 265, 0, 0],
                  ['2016 FY', 218, 143, 181]
                ]);

请记住,将来我们可能会有一个新的经销商,因此循环需要足够灵活,以便将新经销商添加为一列,并相应地将值添加到行中的正确位置。同样如上面的示例数据所示,如果该年没有指定值,则需要在行中添加 0。

【问题讨论】:

  • 需要更多信息,例如,您将如何将 xml 发送给客户端? xml 有命名空间吗?你已经建好页面了吗,还有可以分享的代码吗?
  • @WhiteHat 我可以毫无问题地获取 XML 并循环访问 XML 中的数据,我正在努力解决的部分是找出一种将其放入数组格式的逻辑方法以上与图表一起使用。我如何获取 XML 的示例代码是: $requestURL = 'http:/example.com/API.php?parameter1=value1&parameter2=value2'; $xmlString = simplexml_load_file($requestURL); foreach ($xmlString->dealer as $dealer) { echo $dealer ->dealer;回声 $dealer -> 销售;回声$经销商->年; }
  • 很高兴听到,我有一个完美的例子,当我早上上班时......

标签: javascript php arrays xml google-visualization


【解决方案1】:

这是我用来为google.visualization.arrayToDataTable 构建数组的函数。它需要一个二维数组,您可以为每个列标题/值使用内在值或文字对象。

第一部分构建列标题。使用该对象,您可以为idlabeltype 分配值。 maybe others...

对于列值,对象有两个键:v(值)和f(格式化值)。

  var data = new google.visualization.arrayToDataTable(GetXmlDataArray(xmlObj), false);

  function GetXmlDataArray(sender, args) {
    var colArray;  // column heading array
    var colHdr;    // column heading
    var colValue;  // column value
    var gglArray;  // array to be returned
    var rowArray;  // data row array
    var nlItems;   // xml columns
    var nlRows;    // xml rows

    // init return array and column heading array
    gglArray = [];
    colArray = [];

    // get columns heading xml nodes
    nlItems = sender.get_xml().selectNodes('//cog:item');

    // build column headings
    for (var i = 0; i < nlItems.length; i++) {
      // column literal
      colHdr = {};
      colHdr.id = 'column_' + i;
      colHdr.label = nlItems[i].getAttribute('name');

      // check data type
      switch(nlItems[i].getAttribute('type')) {
        case 'xs:double':
          colHdr.type = 'number';
          break;

        case 'xs:dateTime':
          colHdr.type = 'datetime';
          break;

        default:
          colHdr.type = 'string';
      }

      // add column
      colArray.push(colHdr);
    }

    // add column headings to return array
    gglArray.push(colArray);

    // get column value xml nodes
    nlRows = sender.get_xml().selectNodes('//cog:row');

    // build data rows
    for (var i = 0; i < nlRows.length; i++) {
      // init row array
      rowArray = [];

      // process each column
      for (var x = 0; x < nlRows[i].childNodes.length; x++) {
        // check if column is null
        if (nlRows[i].childNodes[x].getAttribute('xs:nil')) {
          colValue = null;
        } else {
          // set the text value, depends on the browser
          colValue = nlRows[i].childNodes[x].text || nlRows[i].childNodes[x].textContent;
        }

        // check the data type
        switch(colArray[x].type) {
          // format date columns
          case 'datetime':
            // ensure there is a value
            if (colValue) {
              // set date value
              colValue = new Date(colValue);

              // add column value to row array
              rowArray.push({
                v: colValue,                  // column value
                f: colValue.toLocaleString()  // column formatted value
              });
            } else {
              rowArray.push(colValue);
            }
            break;

          default:
            // add column value to row array, no object needed
            rowArray.push(colValue);
        }
      }

      // add column values to return array
      gglArray.push(rowArray);
    }

    return gglArray;
  }

我使用的 XML 看起来与此类似...

<dataset>
    <metadata>
          <item name="Site" type="xs:string" length="18"/>
          <item name="ID" type="xs:double" precision="2"/>
    </metadata>
    <data>
        <row>
            <value>ABC</value>
            <value>4886</value>
        </row>
        <row>
            <value>DEF</value>
            <value>4667</value>
        </row>
        <row>
            <value>GHI</value>
            <value>2892</value>
        </row>
        ...
    </data>
</dataset>

【讨论】:

  • 感谢一百万!我能够对其进行调整以解决我的问题!
  • 太棒了,很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2021-02-06
  • 2011-01-10
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多