0

我在导入 csv 以获得 highstock 图表时遇到了一些问题。我使用与 ohlc 示例相同的代码(在本地运行良好),但使用了另一个 CSV,它是由 php 在我的本地主机上创建的。

PHP 获取 CSV

<?PHP

// Declare the new variable as an array
$arrCSV = array();

// Open the CSV file
if (($handle = fopen("http://ichart.finance.yahoo.com/table.csv?s=AAPL&d=7&e=7&f=2012&g=d&a=8&b=7&c=1984&ignore=.csv", "r")) !==FALSE)
{

// Set the parent array key to 0
$key = 0;
// While there is data available loop through unlimited times (0) using separator (,)
while (($data = fgetcsv($handle, 0, ",")) !==FALSE) {

    // Count the total keys in each row
    $c = count($data);
    //print  $c . "<BR>"; // <------ 7 o numero de colunas

    //Populate the array
    If ($key != 0) {
        $arrCSV[$key-1][0] = strtotime($data[0]); //Time
        $arrCSV[$key-1][1] = $data[1];            //Open
        $arrCSV[$key-1][2] = $data[2];            //High
        $arrCSV[$key-1][3] = $data[3];            //Low
        $arrCSV[$key-1][4] = $data[6];            //Adj Close
        $arrCSV[$key-1][5] = $data[5];            //Volume
    }

    $key++;
} // end while

$keymax = $key;

// Close the CSV file
fclose($handle);
} // end if

print "?(/* AAPL historical OHLC data from the Google Finance API */<BR>";
echo json_encode($arrCSV,JSON_NUMERIC_CHECK);
print ");";

?>

导入和创建图表的代码:

<!DOCTYPE HTML>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>Highstock Example</title>

          <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
      <script type="text/javascript">
$(function() {
   $.getJSON('http://localhost/teste03.php', function(data) {

      // create the chart
      chart = new Highcharts.StockChart({
         chart : {
            renderTo : 'container'
         },

         rangeSelector : {
            selected : 2
         },

         title : {
            text : 'AAPL Stock Price'
         },

         series : [{
            type : 'ohlc',
            name : 'AAPL Stock Price',
            data : data,
            dataGrouping : {
               units : [[
                  'week', // unit name
                  [1] // allowed multiples
               ], [
                  'month', 
                  [1, 2, 3, 4, 6]
               ]]
            }
         }]
      });
   });
});

      </script>
   </head>
   <body>
<script src="js/highstock.js"></script>
<script src="js/modules/exporting.js"></script>

<div id="container" style="height: 500px; min-width: 500px"></div>
   </body>
</html>

最后它只是给我一个空白页......这是由使用本地主机引起的吗?数组的顺序(下降而不是上升)?

帮助?

更新:添加了 json_encode 但仍然不起作用。

4

1 回答 1

0

进一步编辑 似乎您可能有 ajax 问题,请尝试通过以下方式进行隔离测试

使用SimpleTest.php(请参阅OLD部分的代码)并将其托管在与当前相同的服务器上teste03.php,并从中访问图表

 $.getJSON('http://localhost/SimpleTest.php', function(data) {
 ...
 }

或者

<script type="text/javascript">
$(function() {
// $.getJSON('http://localhost/teste03.php', function(data) {
   var data= [[1000000,1,2,3,4],[2000000,3,2,3,4],[1000000,1,2,3,4]];
  // create the chart
  chart = new Highcharts.StockChart({
   ...

如果上述任何方法有效,则意味着您有 ajax 问题而不是 highcharts 问题。

已编辑(基于您对返回的 json 的评论)

数据中的时间戳值需要按升序排列。从您的以下 json

 [[1344290400,622.77,625,618.04,618.26,10373100],[1344204000,617.29,624.87,615.26‌​,619.89,10789400]

1344290400>1344204000 因此不会工作。

OLD
使用json_encode方法来形成 json。
您需要传递给它的是一个数组数组,其中外部数组的大小与 CSV 中的行数相同,并且该外部数组的每个元素都是另一个具有 5 个元素的数组,即。时间戳,开,高,低,收。

SimpleTest.php

<?php
  // JSON header
  header('Content-type: application/json');

  // Do not cache the response
  header('Cache-Control: no-cache, must-revalidate');
  header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');  

  // Parse CSV, and populate the 5 arrays viz. $timeStamp, $open, $high, $low, $close
  $count=3;
  $timeStamp=array(1000000,2000000,3000000); // In ascending order of time
  $open=array(5,10,15);
  $high=array(10,15,20);
  $low=array(0,5,10);
  $close=array(8,12,18);

  $dataArray=array();   // Outer array of array

  for( $i=0; $i<$count; $i++ ){
     // push an array into $dataArray for each data group
     $dataArray[] = array($timeStamp[$i], $open[$i], $high[$i], $low[$i],$close[$i]);
  }

  echo json_encode($dataArray); // Encode php array of array into json and echo/print it to output
?>

查看您的代码,我认为您可以调整 $arrCSV 以转换为所需的数组。

于 2012-08-13T19:23:44.000 回答