2013-03-08 32 views
0

我試圖從CSV中提取多家公司的財務股票數據,並在Highcharts/Highstocks折線圖中將數據顯示爲單獨的系列。我有源代碼設置,我可以將數據+轉換爲JSON,但我無法將數據傳遞給Highcharts。我相信我沒有使用最有效的方法來準備Highcharts使用的數據,我希望有人能夠給我指示我所做的不正確。請看看我的代碼,並讓我意識到您看到的任何低效或明顯的錯誤。將數據傳遞給Highcharts時遇到問題

PHP代碼:

date_default_timezone_set('America/Los_Angeles'); 

$stocks = array('MSFT' => 'http://ichart.finance.yahoo.com/table.csv?s=MSFT', 'AAPL' => 'http://ichart.finance.yahoo.com/table.csv?s=AAPL', 'FB' => 'http://ichart.finance.yahoo.com/table.csv?s=FB'); 
$stocks_data = array(); 

foreach ($stocks as $key=>$stock) { 
    $fh = fopen($stock, 'r'); 
    $header = fgetcsv($fh); 

    $varname = $key . '_data'; 

    $$varname = array(); 
    while ($line = fgetcsv($fh)) { 
     ${$varname}[count($$varname)] = array_combine($header, $line); 
    } 

    fclose($fh); 
} 

foreach($MSFT_data as $val){ 
    $MSFT[] = strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; //sets the date as a javascript timestamp 
} 
$MSFT = json_encode($MSFT); 

foreach($AAPL_data as $val){ 
    $AAPL[] = strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; //sets the date as a javascript timestamp 
} 
$AAPL = json_encode($AAPL); 

foreach($FB_data as $val){ 
    $FB[] = strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; //sets the date as a javascript timestamp 
} 
$FB = json_encode($FB); 

JS代碼:

$(function() { 
    var seriesOptions = [], 
     yAxisOptions = [], 
     colors = Highcharts.getOptions().colors; 

    seriesOptions[0] = { 
     name: 'MSFT', 
     data: <? php echo $MSFT; ?> 
    }; 

    seriesOptions[1] = { 
     name: 'AAPL', 
     data: <? php echo $AAPL; ?> 
    }; 

    seriesOptions[2] = { 
     name: 'FB', 
     data: <? php echo $FB; ?> 
    }; 

    function createChart() { 

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

      rangeSelector: { 
       selected: 4 
      }, 

      yAxis: { 
       labels: { 
        formatter: function() { 
         return (this.value > 0 ? '+' : '') + this.value + '%'; 
        } 
       }, 
       plotLines: [{ 
        value: 0, 
        width: 2, 
        color: 'silver' 
       }] 
      }, 
      plotOptions: { 
       series: { 
        compare: 'percent' 
       } 
      }, 
      tooltip: { 
       pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b> ({point.change}%)<br/>', 
       valueDecimals: 2 
      }, 
      series: seriesOptions 
     }); 
    } 
}); 

如果您有任何問題或需要進一步的信息,請讓我知道了評論。

感謝

BTW:我已經包括了所有必要的資產Highcharts工作;當我用來自Highcharts網站的示例代碼替換我的JS + PHP時,它的效果非常好。所以這個問題顯然在於我的JS + PHP代碼。

+0

你在你的seriesOptions代碼中有關於MSFT,AAPL和FB的報價?相當有信心這會爲未定義的變量拋出錯誤。 – MatthewKremer 2013-03-08 22:45:24

+0

@MthetheKKermer謝謝,只是做了這個改變。仍然沒有工作,但是,這是我的錯誤。 – 585connor 2013-03-08 22:54:44

+0

嗯......我試着複製你的代碼並把它放入JSFiddle(只是用靜態數組替換PHP echo),它工作正常。你可以運行代碼,並在PHP完成並把它放在這裏後查看頁面的HTML源代碼? – MatthewKremer 2013-03-08 23:01:49

回答

3

好的,我相信我發現了這個問題,它的存在方式就是將每個單獨的點存儲在數組中。

取而代之的是(這是傳遞一個字符串的x,y用逗號分隔):

strtotime($val['Date']) * 1000 . ', ' . (float)$val['Close']; 

你將要使用像這樣(Highcharts accepts arrays or associative arrays):

array((strtotime($val['Date']) * 1000), ((float)$val['Close'])); 

這將把X和Y變量存儲爲一個數組,而不是逗號分隔的字符串,以便將javascript作爲數據傳遞。

+0

謝謝,但這似乎並沒有補救我的情況。我認爲問題可能是我的數據數組全部包裝在一個包含數組中。例如,現在看起來應該是[foo,bar],[qux,baz]:[[foo,bar],[qux,baz]]。這似乎是可能導致問題?如果是這樣,我該如何解決? – 585connor 2013-03-08 23:47:26

+0

@ 585connor不,這是應該的。它是一個x,y座標數組的數組。只是好奇,現在你已經在createChart()中初始化圖表了。事後你在調用這個函數嗎?你甚至可能甚至可以刪除函數部分,並立即初始化圖表= Highcharts .... – MatthewKremer 2013-03-09 00:01:44

+0

感謝@MatthewKremer,圖表現在顯示,但它只顯示一組數據(FB),而不是我已經加載的所有三個。任何想法可能會導致這種情況? – 585connor 2013-03-09 00:37:44

相關問題