PHP Grab last 15 lines in txt file

2019-04-09 16:29发布

问题:

Thank you for taking the time to read this and I will appreciate every single response no mater the quality of content. :)

Using PHP, I'm trying to get the last 15 lines of a text document (.txt) and store that data into a php variable. I understand that this is possible, however when I do get the last 15 lines, is it possible to retain the order? For example:

text document:

A
B
C

When I grab the text document from the last 15 characters, I don't want the echo to end up like:

C
B
A

All assistance is appreciated and I look forward to your replies; thank you. :) If I didn't explain anything clearly and/or you'd like me to explain in more detail, please reply. :)

Thank you.

回答1:

Try using array_slice, which will return a part of an array. In this case you want it to return the last 15 lines of the array, so:

$filearray = file("filename");
$lastfifteenlines = array_slice($filearray,-15);


回答2:

If you don't mind loading the entire file into memory:

$lines = array_slice(file('test.txt'), -15);
print_r($lines );

If the file is too large to fit into memory you can use a circular method:

// Read the last $num lines from stream $fp
function read_last_lines($fp, $num)
{
    $idx   = 0;

    $lines = array();
    while(($line = fgets($fp)))
    {
        $lines[$idx] = $line;
        $idx = ($idx + 1) % $num;
    }

    $p1 = array_slice($lines,    $idx);
    $p2 = array_slice($lines, 0, $idx);
    $ordered_lines = array_merge($p1, $p2);

    return $ordered_lines;
}

// Open the file and read the last 15 lines
$fp    = fopen('test.txt', 'r');
$lines = read_last_lines($fp, 15);
fclose($fp);

// Output array
print_r($lines);

This method will also work if the file has less than 15 lines- returning an array with however many lines are in the file.



回答3:

You can use fseek with a negative position to seek backwards through the file, counting newlines as you go.

I'm too tired to write up copy/past-able code, but there are some examples in the comments to the manual page for fseek that are very close to what you want.



回答4:

If the file isn't bigger than available memory you can do this:

$fArray = file("filename");
$len = sizeof($fArray);
for($i=$len -15;$i<$len ;$i++)
{
   echo $fArray[$i];
}

If you have a file that is hundreds of megabytes :

$rc = fopen("file","r");
for ($i=0; $line = fgets($file) ;$i++)
{
   if ($i%15 == 0)
   {
      $last15 = array();
   }
   $last15[] = $line;
}

echo join("\n",$last15);



回答5:

the longer array solution: array_slice(explode("\n",file_get_contents($file)),-15);

the shorter array solution: array_slice(file($file),-15);



回答6:

This code will open the file, show the total lines, show the header of file and show the last lines of file defined in $limit.

<?php
// open the file in read mode
$file = new SplFileObject('file.csv', 'r');

// get the total lines
$file->seek(PHP_INT_MAX);
$last_line = $file->key();
echo $last_line;
echo "<br>";

// Rewind to first line to get header
$file->rewind();

// Output first line if you need use the header to make something
echo $file->current();
echo "<br>";

// selecting the limit
$limit = 6;

// selecting the last lines using the $limit
$lines = new LimitIterator($file, $last_line - $limit, $last_line);

//print all the last 6 lines array
//print_r(iterator_to_array($lines));
//echo "<br>";

// Loop over whole file to use a single line
foreach ($lines as $line) {

    print_r($line);
    echo "<br>";

}