PHP захватить последние 15 строк в текстовом файле - PullRequest
4 голосов
/ 26 августа 2010

Спасибо, что нашли время, чтобы прочитать это, и я буду благодарен за каждый отдельный ответ, независимо от качества контента. :)

Используя PHP, я пытаюсь получить последние 15 строк текстового документа (.txt) и сохранить эти данные в переменной php. Я понимаю, что это возможно, однако, когда я получу последние 15 строк, можно ли сохранить заказ? Например:

текстовый документ:

A
B
C

Когда я беру текстовый документ из последних 15 символов, я не хочу, чтобы эхо заканчивалось как:

C
B
A

Вся помощь приветствуется, и я с нетерпением жду ваших ответов; благодарю вас. :) Если я ничего не объяснил четко и / или вы хотите, чтобы я объяснил более подробно, пожалуйста, ответьте. :)

Спасибо.

Ответы [ 6 ]

10 голосов
/ 26 августа 2010

Попробуйте использовать array_slice, которая вернет часть массива.В этом случае вы хотите, чтобы он возвращал последние 15 строк массива, поэтому:

$filearray = file("filename");
$lastfifteenlines = array_slice($filearray,-15);
5 голосов
/ 26 августа 2010

Если вы не против загрузить весь файл в память:

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

Если файл слишком велик, чтобы поместиться в память, вы можете использовать циклический метод:

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

Этот метод также будет работать, если файл содержит менее 15 строк, возвращая массив с тем количеством строк в файле.

2 голосов
/ 26 августа 2010

Вы можете использовать fseek с отрицательной позицией для поиска в обратном направлении по файлу, считая новые строки по мере продвижения.

Я слишком устал писать код для копирования / прошивки, но в комментариях к странице руководства для fseek есть несколько примеров, очень близких к тому, что вы хотите.

1 голос
/ 26 сентября 2017

Этот код откроет файл, покажет общее количество строк, покажет заголовок файла и покажет последние строки файла, определенные в $ 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>";

}
1 голос
/ 26 августа 2010

решение с более длинным массивом: array_slice(explode("\n",file_get_contents($file)),-15);

решение с более коротким массивом: array_slice(file($file),-15);

1 голос
/ 26 августа 2010

Если файл не больше доступной памяти, вы можете сделать это:

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

Если у вас есть файл размером в сотни мегабайт:

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

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

...