我在数组中有一个列表,想要将仅一行输出到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);
答案 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]]
如果您在理解逻辑上有冲突,请在评论中告诉我。