2011-05-26 35 views
3

我想我可以調用tail,但這意味着取決於外部程序。有沒有辦法以有效的方式使用PHP?PHP:如何向後尋找最後N行


更新:對於那些有興趣,我也跟着我接受的答案得到的建議,並試圖對自己實施。把它on my blog =)

回答

4

你基本上必須重現tail。打開文件,跳到最後,然後開始向後讀。讀取一個塊,計算換行符,重複,直到換行次數>所需行數,然後從該行換行開始轉儲所有內容。

+0

Aha。聰明。將不得不嘗試一下,謝謝! – Svish 2011-05-26 19:29:22

3

那麼你想要最後的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

雖然這會把整個事物都記憶成記憶,不是嗎? – Svish 2011-05-26 19:28:54

+0

對......我認爲目標是使用'a +'模式調用'fopen()'並向後尋找...不首先讀取整個文件。 – 2011-05-26 19:29:43

+0

@Svish如果你在一個文件中搜索,是的。你的問題是模糊的... – lonesomeday 2011-05-26 19:29:57

0

最簡單的方法是使用文件。它將整個文件加載到一個數組中,每行一行。使用count來計算總的行數,從該索引中減去100 en,你可以用這些行來做你想做的事情。

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

對於非常大的文件,這是不是真的有效。那麼你最好使用fstat來獲取文件大小,fseek返回x個字節,計算你可以讀取的行數,並且可能尋找更遠的行,直到找到100行。我敢打賭,像尾巴這樣的工具從一開始就不算,而是做類似的事情。

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)); 

OU tput

$ php test.php 
6 
7 
8 
9 
10