在向Highcharts传递数据时遇到麻烦


Having trouble passing data to Highcharts

我试图从csv中提取多个公司的财务股票数据,并在Highcharts/Hilitocks折线图中将数据显示为单独的系列。我有源设置,我能够拉数据+转换为JSON,但我有麻烦将数据传递给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
        });
    }
});

如果你有任何问题或需要进一步的信息,请告诉我。

感谢

顺便说一句:我有所有必要的资产包括Highcharts的工作;当我用Highcharts网站的示例代码替换我的JS + PHP时,它工作得很漂亮。问题显然出在我的JS + PHP代码上。

好了,我想我找到问题了,问题在于你在数组中存储每个单独点的方式。

而不是这个(它传递了一个用逗号分隔的字符串x,y):

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

你会想要使用这样的东西(Highcharts接受数组或关联数组):

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

将X和Y变量存储为数组,而不是javascript作为数据传递的逗号分隔字符串。