2009-08-17 53 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; 

?>