每次调用php脚本时,都返回csv文件的下一行

时间:2015-07-07 18:08:49

标签: php jquery json csv highcharts

我正在使用highcharts创建一个" live"动态更新数据的图表。它调用一个php文件,它应该解析CSV并将结果输出为json。

My Highcharts / jQuery Code就是这样:

function requestData() {
    $.ajax({
        url: 'datatest.php',
        success: function(point) {
            var series = chart.series[0],
                shift = series.data.length > 20; // shift if the series is longer than 20

            // add the point
            chart.series[0].addPoint(eval(point), true, shift);

            // call it again after one second
            setTimeout(requestData, 10000); 
        },
        cache: false
    });
}

我的datatest.php文件是:

<?php 

header("Content-type: text/json");

$handle = fopen("WindSpeed.csv", "r");

$windVals = fgetcsv($handle, 1000, ",");

$x = time() * 1000;

$y = $windVals[0];

// Create a PHP array and echo it as JSON
$ret = array($x, $y);
echo json_encode($ret);

?>

但是,每次调用php脚本时,我都无法弄清楚如何传递csv的下一行;它不断地将相同的json值(在csv的第一行)传递给highcharts,因此它只显示一条扁平的直线。

我对此非常陌生,但每次调用PHP脚本时,有没有办法解析CSV文件的下一行?或者有更好的替代方法吗?

谢谢,

此致 千电子伏

1 个答案:

答案 0 :(得分:1)

我对JavaScript不太满意并且不完全记住您发布的内容的范围规则,因此这里是PHP。这样的事情应该通过在会话中存储行并在每次调用脚本时递增它来起作用。这使用file()将所有行读入数组:

session_start();
$_SESSION['line'] = isset($_SESSION['line']) ? ++$_SESSION['line'] : 0;

$lines = file('WindSpeed.csv');

if(isset($lines[$_SESSION['line']])) {
    $windVals = str_getcsv($lines[$_SESSION['line']], ',');
} else {
    $_SESSION['line'] = 0;
}

header("Content-type: text/json");
$x = time() * 1000;
$y = $windVals[0];
$ret = array($x, $y);
echo json_encode($ret);

如果文件很大,您可能希望使用fgetcsv()循环播放,直至到达正确的行。类似的东西:

session_start();
$_SESSION['line'] = isset($_SESSION['line']) ? ++$_SESSION['line'] : 0;

$handle = fopen('WindSpeed.csv', 'r');

$i = 0;
while(($windVals = fgetcsv($handle, 1000, ',')) && $i <= $_SESSION['line']) {
    $i++;
}
if(!$windVals) {
    $_SESSION['line'] = 0;
}

header("Content-type: text/json");
$x = time() * 1000;
$y = $windVals[0];
$ret = array($x, $y);
echo json_encode($ret);