PHP:如何向后寻找最后N行

时间:2011-05-26 19:22:02

标签: php tail

我想我可以调用tail,但这意味着取决于外部程序。有没有办法以只使用PHP的有效方式执行此操作?


更新:对于那些感兴趣的人,我按照我在接受的答案中得到的建议,并尝试自己实施。把它on my blog =)

4 个答案:

答案 0 :(得分:6)

所以你想要一个字符串的最后n行?

function getLastLines($string, $n = 1) {
    $lines = explode("\n", $string);

    $lines = array_slice($lines, -$n);

    return implode("\n", $lines);
}

然后,您可以使用getLastLines($str, $num);调用此选项,其中$num是一个正整数,$str是您想要删除的字符串。

如果您想要不同的东西,例如使用文件作为来源,您需要一些不同的东西 - 可能使用file代替explode

答案 1 :(得分:4)

基本上你必须重现tail。打开文件,跳到最后,然后开始向后阅读。读取一个块,计算换行符,重复直到换行计数>所需的行数,然后从一个换行符开始转储所有内容。

答案 2 :(得分:0)

最简单的方法是使用文件。它将整个文件加载到一个数组中,每个项目一行。使用count来计算总行数,从该索引中减去100 en,你可以用行做你想做的事。

http://nl.php.net/manual/en/function.file.php

对于非常大的文件,这不是很有效。然后你最好使用fstat获取文件大小,fseek返回x个字节,计算你可以读取的行数,可能会再寻找,直到找到100行。我打赌像尾巴这样的工具从一开始就算不上,但做了类似的事情。

答案 3 :(得分:0)

如果您使用file()将数据作为数组读入,则可以使用array_splice指定最后N行:

<强>的test.txt

1
2
3
4
5
6
7
8
9
10

<强> test.php的

$lines = file('test.txt');
$line_number = 5;

echo implode("", array_splice($lines, count($lines) - $line_number));

<强>输出

$ php test.php
6
7
8
9
10