Я пытаюсь прочитать текстовый файл из 5000 строк. Однако я хочу только получить первые 10 строк из каждых 100 строк. Итак, строка 1-10, строка 101 – 110, строка 200 – 210 и т. Д. Я просто не могу понять, какую логику использовать.
$count = count(file($text)) for ($i = 0; $i < $count; $i++) { $test = fgets($f_text) }
Используйте % 100
и только печатайте строки, где $n % 100 > 0 && $n % 100 <= 10
.
$lines = file($text); foreach ($lines as $n => $line) { if ($n % 100 > 0 && $n % 100 <= 10) { echo $line; // or whatever } }
foreach (range(0,250) as $n => $line) { if ($n % 100 >= 1 && $n % 100 <= 10 ) { echo $i . "\n"; } } 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 201 202 203 204 205 206 207 208 209 210
Вы можете легко сделать это с помощью SPLFileObject
, если знаете, сколько строк находится в файле:
$file = new SplFileObject( $filename, "r"); $lines = 0; while ( !$file->eof()) { $file->fgets(); $lines++; }
Теперь вы знаете, что в файле есть $lines
строк. Если это статично, скажем 5000, просто инициализируйте $lines
до 5000. Если это не так, давайте округлим это до ближайшего 100:
$lines -= ($lines % 100);
Теперь мы просто перебираем каждую сотню, стремимся к группировке 10 и получаем нужные нам данные:
$data = array(); for( $i = 0; $i < $lines; $i += 100) { $file->seek( $i); for( $j = 0; $j < 10; $j++) { $data[] = $file->fgets(); } }
С помощью этого решения вы никогда не загружаете весь файл в память, что позволит сэкономить ресурсы при работе с большими файлами. Кроме того, если вы заранее знаете размер файла, вы будете читать только строки данных, которые вам нужны.
Основываясь на обоих других ответах, возможно, наиболее эффективный для памяти способ сделать это:
foreach(new SplFileObject($filename) as $n => $line) if($n % 100 < 10) echo $line;