PHP читает следующую строку в текстовом файле при использовании ленивой загрузки?

У меня есть текстовый файл, который я хочу прочитать построчно. Для каждой строки мне также нужно значение из следующей строки, поэтому мне нужно что-то, чтобы прочитать следующую строку, находясь в текущей строке.

Я прочитал здесь много ответов, что я могу сделать это с помощью цикла foreach, но для этого требуется прочитать весь файл заранее. Я ищу что-то, чтобы читать только по мере необходимости.

Вот что я получил с помощью SplFileObject.

$file = new \SplFileObject($textFile);
$lastNumber = 500;

while (!$file->eof()) {
    $currentLine = $file->fgets();

    $currentNumber = intval($currentLine);
    $file->next();

        if ($file->eof()) {
            $nextNumber = intval($lastNumber);
        } else {
            $nextNumber = intval($file->fgets()) - 1;
        }

        echo $currentNumber . ', ' . $nextNumber . '<br>';

}

Предположим, у меня есть текст, в котором есть такие строки

0
100
200
300
400

Я хочу, чтобы они распечатывались так

0, 99
100, 199
200, 299
300, 399
400, 500

Но мой код пропускал каждую вторую строку

0, 99
200, 299
400, 500

Я предполагаю, что мой цикл while и $file->next() каждый перемещают строку на 1 каждый цикл, поэтому пропуск. Но без вызова next() я не знаю, как получить значение следующей строки. Как это исправить?


person reddy    schedule 03.01.2020    source источник
comment
Вы можете создать простой стек. Поместите на него две линии при первом прогоне перед выполнением цикла. Затем запустите цикл, у вас есть текущий и следующий доступные. В самом цикле извлеките текущий из стека, прочитайте следующую строку и поместите в стек.   -  person Markus Zeller    schedule 03.01.2020


Ответы (1)


Используйте это решение кода PHP.

  $textFile = 'text.txt';

  $file = new SplFileObject($textFile);
  $lastNumber = 500;

  foreach ($file as $lineNumber => $line) {
    $currentNumber = intval($file->current());

    if ($lineNumber === 0) {
      $previousNumber = $currentNumber;
      continue;
    } else {
      $nextNumber = $currentNumber - 1;
      echo $previousNumber . ', ' . $nextNumber . '<br>';

      $previousNumber = $currentNumber;

      if ($file->eof()) {
        $nextNumber = intval($lastNumber);
        echo $currentNumber . ', ' . $nextNumber . '<br>';
      }
    }
  }
person Tunji Oyeniran    schedule 03.01.2020
comment
Будет ли это делать ленивую загрузку? - person reddy; 03.01.2020
comment
Что подразумевается под ленивой загрузкой? Это PHP, а не JAVASCRIPT. Пожалуйста, объясните точную функциональность, которую вы хотите достичь. - person Tunji Oyeniran; 07.01.2020