2009-08-17 54 views
1

我只是想出如何讀取一些文件,但我真的不喜歡它。更好的方法來做到這一點? (在php中讀取文件)

我有一些文件名爲1.txt,2.txt,3.txt等。我需要閱讀並打印最後2個文件。我找到了一種方法來做到這一點,但我希望看到其他方法來做到這一點。

我的方式:

<?php 

$i = 1; 
$x = 1; 

while (file_exists('news/'.$i.'.txt')){ 
    $i++; 
} 

$i--; 

while ((file_exists('news/'.$i.'.txt')) && ($x <= 2)){ 
    $data = file_get_contents('news/'.$i.'.txt'); 
    echo $data; 
    $i--; 
    $x++; 
} 

?> 

謝謝!

回答

1

有可能是與scandir()方法的一個問題:文件名字典順序排序,即的1.txt,10.txt,11.txt,2.txt,20.txt,3.txt ,. ..
因此,如果你真的想改變你的代碼我建議scandir()/glob()natsort()

這個功能實現了訂單字母數字串中的一個人會同時保持鍵/值的關聯方式的排序算法。
$files = glob('news/*.txt'); 
natsort($files); 
$files = array_slice($files, -2); 
3

它看起來是一個很好的做法,它有什麼問題?

+1

我同意@lunky。 – Pawka 2009-08-17 18:38:19

+1

其中一個效率不高 – amr 2009-08-17 19:40:38

0

我會做這種方式,我認爲這是更具可讀性:

$allTextFiles = glob('news/*.txt'); 
$numericTextFiles = array_filter($allTextFiles, create_function('$file', 'return is_numeric(basename($file, ".txt"));')); 
asort($numericTextFiles); 
readfile(end($numericTextFiles)); 
readfile(prev($numericTextFiles)); 
2

這將是方便,如果你有新聞條目的數據庫記錄,這樣就可以只查詢而不是從讀取數據庫磁盤。但是,如果這是不是一種選擇,你可能會考慮這樣的:

$files = scandir('news/', 1); 
for($i = 0; $i < 2; $i++) { 
    $data = file_get_contents($files[0]); 
    echo $data; 
} 

它使用scandir函數在PHP 5中

3

或者,你可以將所有的文件名加載到一個數組scandir() ,然後只讀數組中提到的最後兩個文件:

1
$files = glob('news/*.txt'); // This is assuming all *.txt files have numbers for the * part 

$files = rsort($files); 

for ($x = 0; $x < 2; $x++) { 
    readfile($files[$x]); 
} 

雖然,你可以用scandir替換glob/rsort行,按照Jonathan Sampson的回答。

您現在是否正在使用PHP5,是嗎?

1
<?PHP 

$array = scandir($dir);  

$num = count($array); 

$data1 = file_get_contents($array[$num-2]); //almost last file 
$data2 = file_get_contents($array[$num-1]); //last file 

echo $data1, $data2; 

?>