PHP:如何仅输出数组中的一行,并让它记住停在哪里?

时间:2018-10-02 00:24:02

标签: php arrays list

我在数组中有一个列表,想要将仅一行输出到output.csv文件中。我每周运行一次此脚本,并希望按从上到下的顺序输出行。然后在最后(在本例中为第6周)循环回到起点。脚本如何跟踪其停止的位置,以便知道接下来要处理的行?任何帮助表示赞赏!

$list = array
(
"some text|blue|22|sky",
"some text|red|42|ocean",
"some text|green|25|mountain",
"some text|orange|62|space",
"some text|brown|15|earth",
);

$file = fopen("output.csv","w");

foreach ($list as $line)
{
fputcsv($file,explode('|',$line));
}

fclose($file);

2 个答案:

答案 0 :(得分:0)

我建议使用基于文件的方法来跟踪情况。由于不依赖时区或DST,这将是更可靠和可移植的方法

  

基于文件的方法

<?php

//read the last record
try
{
    $fileName = "record.txt";

    if ( !file_exists($fileName) ) {
        file_put_contents("record.txt",'0'); // default - first line if run first time
    }

    $fp = fopen($fileName, "r+");
    if ( !$fp ) {
        throw new Exception('File open failed.');
    }  

    $str = (int) fread($fp, 1); // read the first char, index to use for array
    fclose($fp);

} catch ( Exception $e ) {
  echo $e->getMessage();
} 


$list = array
(
    "some text|blue|22|sky",
    "some text|red|42|ocean",
    "some text|green|25|mountain",
    "some text|orange|62|space",
    "some text|brown|15|earth",
);

$file = fopen("output.csv","w");
$line = $list[$str];
fputcsv($file,explode('|',$line));
fclose($file);

//save what index should it read next time
$incr =  intval($str)+1;
$incr = $incr == ( count($list) )? 0: $incr;
file_put_contents("record.txt",$incr);
  

基于日期的方法

<?php

$date = new DateTime();

$week = $date->format("W");


$list = array
(
    "some text|blue|22|sky",
    "some text|red|42|ocean",
    "some text|green|25|mountain",
    "some text|orange|62|space",
    "some text|brown|15|earth",
);


$str = $week % count($list);

$file = fopen("output.csv","w");
$line = $list[$str];
fputcsv($file,explode('|',$line));
fclose($file);

基于日期的方法的一个优点值得一提,就是如果在给定的一周内多次运行脚本,您将获得相同的输出,但是基于文件的方法却并非如此,因为record.txt会在每次运行脚本时更改。

答案 1 :(得分:0)

针对上述情况的一种更简单的解决方案是:

[[1, 5, 2], [3, 4, 0], [6, 8, 7]]

如果您在理解逻辑上有冲突,请在评论中告诉我。