這是一種方式
$fileend = array();
$file = fopen("/tmp/$importedFile.csv","r");
while ($line = fgetcsv($file))
{
// we have a line, so if $fileend already contains the required number
// of lines we have to make some room.
if (count($fileend) > 20) {
$fileend=array_shift($fileend);
}
// add freshly read line to array's end
array_push($fileend,$line);
}
fclose($file);
// at this point $fileend will contain the 20 last lines of the file.
我不能向你保證,這將是令人眼花繚亂的快速,但...
一個muich更快的方式將將行存儲在固定大小的循環緩衝區中,這比它聽起來容易
$i=0;
while ($line = fgetcsv($file))
{
// store as linenumber modulo 20 'th element in array
$circularbuffer[$i % 20] = $line;
$i++;
}
然後讀它
// must start reading after last written element, $i has the correct value.
// and we will read 20 times - same modulo calculation to "circulate" buffer
for ($j=$i;$j<$i+20;$j++) {
$body_data['csv_preview'][] = $circularbuffer[$j%20];
}
顯然這裏的一大優勢是,你讀的文件只有一次,我認爲讀操作是迄今爲止最昂貴的(執行時間)的部分功能。
來源
2012-07-25 13:41:01
fvu
+1(從來沒有使用過該文件()函數),但你可以進一步簡化,很多僅僅閱讀從過去的20種元素'file($ file)'生成的數組,然後使用'str_getcsv'來解析行,不需要重新讀取文件。唯一潛在的缺點是需要讀取大量csv文件時會消耗的內存。 – fvu 2012-07-25 14:38:05