0

CSVから複数の会社の財務在庫データを取得し、そのデータをHighcharts/Highstocks折れ線グラフに個別の系列として表示しようとしています。ソースを設定し、データをプルして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が機能するために必要なすべてのアセットが含まれています。JS + PHPをHighchartsサイトのサンプルコードに置き換えると、うまく機能します。したがって、問題は明らかに私のJS+PHPコードにあります。

4

1 に答える 1

3

わかりました、私は問題を見つけたと思います。それは、配列に個々のポイントを格納する方法にあります。

これの代わりに (コンマで区切られた文字列 x,y を渡します):

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

次のようなものを使用したいと思うでしょう ( Highcharts は配列または連想配列を受け入れます):

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

これにより、JavaScript がデータとして渡すためのコンマ区切りの文字列ではなく、X 変数と Y 変数が配列として格納されます。

于 2013-03-08T23:14:01.980 に答える