PHP 获取文本文件中最后15行

4
感谢您抽出时间阅读此内容,无论回复的质量如何,我都将不胜感激。 :)
使用PHP,我试图获取文本文档(.txt)的最后15行,并将这些数据存储到一个PHP变量中。我知道这是可能的,但当我获取最后15行时,是否可能保留顺序?例如:
文本文档:
A
B
C

当我从最后15个字符中提取文本文档时,我不希望输出结果出现以下情况:

C
B
A

非常感谢您的帮助,期待您的回复,谢谢。 :) 如果我没有清楚地解释任何事情,或者您想让我更详细地解释,请回复。:)

谢谢。


我已经用完了关闭投票的机会,而且太累了,不能再熬35分钟了。但是无论如何:可能是php如何只读取txt文件的最后5行的重复问题。 - Gordon
另一个问题:如何在PHP中从第x行到第y行打开文件。 - Gordon
6个回答

10

尝试使用array_slice,它可以返回数组的一部分。在这种情况下,您想要它返回数组的最后15行,因此:

$filearray = file("filename");
$lastfifteenlines = array_slice($filearray,-15);

嗨Bob Baddeley,感谢您的回复和努力。我非常感激。;) 当我尝试回显$lastfifteenlines时,它似乎只显示文本“Array”,当然,我相信这是我的错误和我缺乏php知识所致。再次感谢您的回复和努力。;) - aullah
使用echo代替implode("\n", $lastfifteenlines) - Hammerite
嗨,Hammerite,感谢您的回复。我非常感激,使用这段代码甚至可以按正确顺序分配变量。感谢您的回复和努力。;) - aullah

5
如果您不介意将整个文件加载到内存中:
$lines = array_slice(file('test.txt'), -15);
print_r($lines );

如果文件太大无法放入内存,您可以使用循环方法:

// Read the last $num lines from stream $fp
function read_last_lines($fp, $num)
{
    $idx   = 0;

    $lines = array();
    while(($line = fgets($fp)))
    {
        $lines[$idx] = $line;
        $idx = ($idx + 1) % $num;
    }

    $p1 = array_slice($lines,    $idx);
    $p2 = array_slice($lines, 0, $idx);
    $ordered_lines = array_merge($p1, $p2);

    return $ordered_lines;
}

// Open the file and read the last 15 lines
$fp    = fopen('test.txt', 'r');
$lines = read_last_lines($fp, 15);
fclose($fp);

// Output array
print_r($lines);

如果文件行数少于15行,则该方法也适用-返回包含文件中实际行数的数组。


嘿,David Churchill,感谢您的回复和努力。我非常感激,无法表达我的感激之情。 ;) - aullah

2
你可以使用带有负位置的 fseek 来反向查找文件,并在遍历时计算换行符。
我太累了,无法编写可复制的代码,但是在 fseek 的手册页面评论中有一些非常接近你所需的示例。

1
这段代码将打开文件,显示总行数,显示文件头,并显示在$limit中定义的文件的最后几行。
<?php
// open the file in read mode
$file = new SplFileObject('file.csv', 'r');

// get the total lines
$file->seek(PHP_INT_MAX);
$last_line = $file->key();
echo $last_line;
echo "<br>";

// Rewind to first line to get header
$file->rewind();

// Output first line if you need use the header to make something
echo $file->current();
echo "<br>";

// selecting the limit
$limit = 6;

// selecting the last lines using the $limit
$lines = new LimitIterator($file, $last_line - $limit, $last_line);

//print all the last 6 lines array
//print_r(iterator_to_array($lines));
//echo "<br>";

// Loop over whole file to use a single line
foreach ($lines as $line) {

    print_r($line);
    echo "<br>";

}

请添加一些说明以解释答案。 - jjj
1
description added. - Rodrigo Santana

1
如果文件大小不超过可用内存,则可以执行以下操作:
$fArray = file("filename");
$len = sizeof($fArray);
for($i=$len -15;$i<$len ;$i++)
{
   echo $fArray[$i];
}

如果你有一个几百兆的文件:

$rc = fopen("file","r");
for ($i=0; $line = fgets($file) ;$i++)
{
   if ($i%15 == 0)
   {
      $last15 = array();
   }
   $last15[] = $line;
}

echo join("\n",$last15);


1
第二种方法只有在文件中的行数是15的倍数时才有效。如果有20行(编号从0到19),那么你只能得到最后5行。 - Hammerite
嗨,拜伦·惠特洛克,感谢您的回复,我非常感激。 :) 不过有一个小问题,阅读完txt文档的最后15行后,我想为每个文本提供自己的php变量。但是,当我去做这个时,它会抓取最后一行的数据,所以我不能为上面的行添加任何变量。有没有什么办法可以解决这个问题?对于这个问题我很抱歉,尤其是因为它似乎有点离题。再次感谢您的回复。 ;) - aullah

1

更长的数组解决方案: array_slice(explode("\n",file_get_contents($file)),-15);

更短的数组解决方案: array_slice(file($file),-15);


嗨stillstanding,非常感谢您的回复!我并不是php方面的专家,虽然我知道它的内部细节,但我对数组并不太熟悉。只要我能将php变量分配给数组内容,我就不介意使用数组。无论如何,我非常感谢您的回复以及您花费的时间和精力。;)谢谢。 - aullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接