【问题标题】:Return the next line of a csv file each time a php script is called每次调用 php 脚本时返回 csv 文件的下一行
【发布时间】:2015-07-07 18:08:48
【问题描述】:

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

我的 Highcharts/jQuery 代码是这样的:

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 文件的下一行?或者有更好的替代方法吗?

谢谢,

问候, 凯夫

【问题讨论】:

  • 为什么不在ajax函数上使用一个计数器,每次触发该函数时加一。您将它作为参数传递给 datatest.php 并使用它来跳过已经读取的尽可能多的 csv 行?

标签: php jquery json csv highcharts


【解决方案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);

【讨论】:

  • 太棒了,效果很好,干杯!我必须做的唯一改变是 $_SESSION['line']++ 到 ++$_SESSION['line'],增加 line 然后返回它,而不是返回 THEN 递增 - 后一种方式它保持它从不递增跨会话。
  • 只是补充一下 - 我不得不使用 $y = (float)$windVals[0],因为它返回了一个 Highcharts 无法读取的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2011-06-02
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多