php - fgets - прочитать первую строку дважды?

у меня есть цикл while, который FGETS проходит через внешний файл, а затем выполняет функцию a() для каждой строки.

то, что я хочу сделать, это сначала посмотреть на первую строку. если строка соответствует определенным критериям, я хочу выполнить с ней функцию b(), а затем заставить цикл while работать с функцией a() над строками 2+.

если первая строка НЕ ​​соответствует критериям, то я хочу, чтобы цикл while работал с функцией a() по строкам 1+.

возможно ли это без необходимости закрывать и снова открывать файл?


person Community    schedule 07.08.2011    source источник
comment
что вы подразумеваете под lines 2+, вы имеете в виду следующие две строки?   -  person Billy Moon    schedule 07.08.2011
comment
я имею в виду все строки, начиная со второй вверх.   -  person    schedule 07.08.2011
comment
Разве 2-й вверх не будет просто строкой 1 и 2? Вы имеете в виду 2-ю, 3-ю, 4-ю до последней строки? Вот бы все строки, которые еще не были прочитаны?   -  person Billy Moon    schedule 07.08.2011


Ответы (3)


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

fseek($file,0);
person RiaD    schedule 07.08.2011

Абсолютно. Вот один из способов:

if (($line = fgets(...)) !== false)
{
  if (meets_criteria($line))
  {
    b($line);
  }
  else
  {
    a($line);
  };
  while (($line = fgets(...)) !== false)
  {
    a($line);
  };
};

Не стесняйтесь исправлять найденные ошибки.

person Ignacio Vazquez-Abrams    schedule 07.08.2011
comment
это хорошая мысль, вау. я пошел с ответом fseek ниже, прежде чем у меня была возможность взглянуть на вашу версию. теперь я порвался :))) - person ; 07.08.2011
comment
Мой ответ нарушает DRY, но он также работает с потоками. - person Ignacio Vazquez-Abrams; 07.08.2011

Если файл не слишком велик для чтения в память, вы можете просто использовать file() вместо FGETS, как это

$lines = file('the-data.file');
foreach($lines as $line){
 if (meets_criteria($line))
  {
    b($line);
    a(implode(array_slice($lines,2)));
  }
  else
  {
    a(implode($lines));
  };
};
person Billy Moon    schedule 07.08.2011