我有一个txt文件,我想向后阅读,目前我正在使用它:
$fh = fopen('myfile.txt','r');
while ($line = fgets($fh)) {
echo $line."<br />";
}
这会输出我文件中的所有行 我想从下到上阅读这些行。
有办法吗?
答案 0 :(得分:12)
第一种方式:
$file = file("test.txt");
$file = array_reverse($file);
foreach($file as $f){
echo $f."<br />";
}
第二种方式(a):
完全撤消文件:
$fl = fopen("\some_file.txt", "r"); for($x_pos = 0, $output = ''; fseek($fl, $x_pos, SEEK_END) !== -1; $x_pos--) { $output .= fgetc($fl); } fclose($fl); print_r($output);
第二种方式(b): 当然,你想要逐行逆转......
$fl = fopen("\some_file.txt", "r"); for($x_pos = 0, $ln = 0, $output = array(); fseek($fl, $x_pos, SEEK_END) !== -1; $x_pos--) { $char = fgetc($fl); if ($char === "\n") { // analyse completed line $output[$ln] if need be $ln++; continue; } $output[$ln] = $char . ((array_key_exists($ln, $output)) ? $output[$ln] : ''); } fclose($fl); print_r($output);
答案 1 :(得分:4)
这是我向后打印文件的解决方案。这非常对内存友好。并且似乎更具可读性(IMO [=在我看来])。
它向后遍历文件,计算字符直到行的开头或文件的开头,然后读取并打印出该行数量的字符,然后将光标向后移动并读取另一行... / p>
if( $v = @fopen("PATH_TO_YOUR_FILE", 'r') ){ //open the file
fseek($v, 0, SEEK_END); //move cursor to the end of the file
/* help functions: */
//moves cursor one step back if can - returns true, if can't - returns false
function moveOneStepBack( &$f ){
if( ftell($f) > 0 ){ fseek($f, -1, SEEK_CUR); return true; }
else return false;
}
//reads $length chars but moves cursor back where it was before reading
function readNotSeek( &$f, $length ){
$r = fread($f, $length);
fseek($f, -$length, SEEK_CUR);
return $r;
}
/* THE READING+PRINTING ITSELF: */
while( ftell($v) > 0 ){ //while there is at least 1 character to read
$newLine = false;
$charCounter = 0;
//line counting
while( !$newLine && moveOneStepBack( $v ) ){ //not start of a line / the file
if( readNotSeek($v, 1) == "\n" ) $newLine = true;
$charCounter++;
}
//line reading / printing
if( $charCounter>1 ){ //if there was anything on the line
if( !$newLine ) echo "\n"; //prints missing "\n" before last *printed* line
echo readNotSeek( $v, $charCounter ); //prints current line
}
}
fclose( $v ); //close the file, because we are well-behaved
}
当然,用您自己的文件路径替换PATH_TO_YOUR_FILE
,打开文件时会使用@
,因为当找不到文件或无法打开文件时 - 会引发警告 - 如果你想显示这个警告 - 只需删除错误抑制器'@'。
答案 2 :(得分:3)
尝试更简单的事情..
print_r(array_reverse(file('myfile.txt')));
答案 3 :(得分:1)
如果文件不是很大,您可以使用file()
:
$lines = file($file);
for($i = count($lines) -1; $i >= 0; $i--){
echo $lines[$i] . '<br/>';
}
但是,这需要将整个文件放在内存中,这就是为什么它不适合真正大的文件。
答案 4 :(得分:0)
这是我的简单解决方案,没有弄乱任何东西或添加更复杂的代码
$fh = fopen('myfile.txt','r');
while ($line = fgets($fh)) {
$result = $line . "<br>" . $result;
}
echo $result // or return $result if you are using it as a function