5

我想我可以调用tail,但这意味着取决于外部程序。有没有办法只使用 PHP 以有效的方式做到这一点?


更新:对于那些感兴趣的人,我遵循了我在接受的答案中得到的建议,并尝试在自己身上实施。把它放在我的博客上=)

4

4 回答 4

8

所以你想要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.

于 2011-05-26T19:28:30.347 回答
4

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

于 2011-05-26T19:26:56.510 回答
0

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

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

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

于 2011-05-26T19:29:14.590 回答
0

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

测试.txt

1
2
3
4
5
6
7
8
9
10

测试.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
于 2011-05-26T19:31:27.210 回答