- Как считать с файла .txt рандомную строку на php?
- Как в PHP выдернуть рандомно уникальные строки из текстового файла?
- Как считать с файла .txt рандомную строку PHP
- 1 ответ 1
- Как сделать посредством php выборку рандомную из txt файлов
- Урок по программированию на PHP для начинающих #5 — изучаем массивы и выводим случайную строку из файла.
- Ассоциативные массивы
- Вывод случайно цитаты
Как считать с файла .txt рандомную строку на php?
Чтение случайной строки из текстового файла в PHP можно осуществить следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
php // Открываем файл $file = fopen("file.txt", "r"); // Получаем количество строк в файле $line_count = 0; while (!feof($file)) < $line = fgets($file); $line_count++; > // Генерируем случайное число для выбора строки $random_line_number = rand(1, $line_count); // Сбрасываем указатель на начало файла rewind($file); // Считываем случайную строку $current_line_number = 0; while (!feof($file)) < $line = fgets($file); $current_line_number++; if ($current_line_number == $random_line_number) < echo $line; break; > > // Закрываем файл fclose($file); ?>
В этом примере мы открываем файл file.txt и считываем количество строк в нем, затем генерируем случайное число от 1 до количества строк и считываем эту строку с помощью цикла while и функции fgets() . Затем мы выводим эту строку на экран и закрываем файл.
Обратите внимание, что в этом примере мы используем функцию rewind() для сброса указателя на начало файла перед чтением случайной строки. Если этого не сделать, то второй цикл while не сможет прочитать строки из файла.
Как в PHP выдернуть рандомно уникальные строки из текстового файла?
Имеем текстовой фал с N-м количеством строк текста (строки необязательно должны быть предложениями, и необязательно со знаками препинания).
Допустим нужно выдернуть из этого файла 150 случайных строк и вывести их.
На одном из форумов увидел вот такой код (который вроде как должен как раз реализовать такую идею, однако, я попробовал — и каждый раз скрипт выводит одну-две строки текста (номер строки : текст), а остальные строки только номера строк без текста. ). Помогите найти ошибку. Заранее спасибо.
——-
КОД:
# Подсчитываем кол-во строк в файле.
$f = fopen(‘semantic.txt’, «r»);
# Подсчитываем кол-во строк в файле.
function FileGetCount( $path ) if ( $f = fopen( $path , «r» ) ) $counter = 0;
while (fgets($f)) < $counter++; >
fclose($f);
return $counter;
>
return false;
>
function GetRandomArray( $num , $lineCount ) if ( $num > $lineCount ) $num = $lineCount;
>
$subFunction = function( &$result , &$num , $min , $max ) use(&$subFunction) if ( ( $num $max ) ) return [];
>
$key = mt_rand( $min , $max );
$result[] = $key;
$num—;
if ( mt_rand(0,1) ) $subFunction( $result , $num , $min , $key-1 );
$subFunction( $result , $num , $key+1 , $max );
> else $subFunction( $result , $num , $key+1 , $max );
$subFunction( $result , $num , $min , $key-1 );
>
>;
$result = [];
$subFunction( $result , $num , 0 , $lineCount — 1 );
return $result;
>
function EchoRandomLine( $path , $randomMap ) if ( $f = fopen( $path , «r» ) ) $last = 0;
foreach($randomMap as $line) rewind($f);
$newLine = $line = $line+1;
while($newLine—) $buffer = fgets($f);
>
echo «$line : $buffer
«; # номер_строки : сама_строка
>
fclose($f);
return true;
>
return false;
>
$path = «semantic.txt»;
$countRandomLine = 150;
$countLine = FileGetCount( $path );
$randomMap = GetRandomArray( $countRandomLine , $countLine );
EchoRandomLine( $path , $randomMap );
?>
Простой 1 комментарий
Как считать с файла .txt рандомную строку PHP
Есть словарь с множеством слов, каждое новое слово начинается с новой строки. Как можно занести в переменную $words рандомное слово.
1 ответ 1
Если файл огромный, чтоб ни читать его весь, не разбивать на строки, не считать количество строк, не выбирать случайную из них. Можно выстрелить приблизительно по строке =)
//Имя файла $FILENAME = "/home/user/text.txt"; //Разделитель строк в файле $LINE_DELIMITER = "\n"; //Максимальная разумная длина одной строки $MAX_LINE_LEN = 255 + strlen($LINE_DELIMITER); //Берем немного с запасом $TRIPLE_BUFFER = $MAX_LINE_LEN * 3; //Длина файла $fileLen = filesize($FILENAME); //На всякий случай проверим длину файла if (empty($fileLen) || $fileLen < $TRIPLE_BUFFER) < throw new \ErrorException("Файл слишком мал"); >//Случайная позиция для чтения $rnd = rand(0, $fileLen - $TRIPLE_BUFFER); //Открываем файл для чтения $handle = fopen($FILENAME, "r"); //Устанавливаем указатель в случайном месте файла fseek($handle, $rnd); //Читаем начиная со случайной позиции $stream = fread($handle, $TRIPLE_BUFFER); //Разбиваем текст на строки $lines = explode($LINE_DELIMITER, $stream); //Считаем количество прочитанных строк $lineCount = count($lines); //Инициализируем нашу случайную строку $randomLine = ""; //Пропускаем первую строку, так как она может быть обрезана $startAtLine = ($rnd !== 0) ? 1 : 0; //Ищем случайную строку for ($i = $startAtLine; $i < $lineCount; $i++) < //Пропускаем пустые строки if (!empty($lines[$i])) < //Ну и наконец, вот наша случайная строка $randomLine = $lines[$i]; break; >>
Как сделать посредством php выборку рандомную из txt файлов
Как настроить(посредством php) рандомную выборку какой-то строки из определенного txt файла и вывести ее на странице? К примеру ключи в файле и их нужно выводить на страницах рандомно, чтобы не повторялось?
$lines = file(‘file.txt’); $cnt = count($lines); $rand = rand(0, ($cnt-1)); echo trim($lines[$rand]); // выводит случайную строку Что значит чтобы не повторялись? На главной — ключ1 на «контакты» — ключ10 на «галерея» — ключ 100500 или как?
Милованов Ю.С:
$lines = file(‘file.txt’);
$cnt = count($lines);
$rand = rand(0, ($cnt-1));
echo trim($lines[$rand]); // выводит случайную строку
Что значит чтобы не повторялись?
На главной — ключ1
на «контакты» — ключ10
на «галерея» — ключ 100500
или как?
Значит примерно это, да. То есть, если десять ключей и десять страниц, то не должно быть страниц с тем же ключём, что и на какой-то странице. А можете по объяснить просто, что все эти строки значат?
$lines = file(‘file.txt’); — читаем файл в индексный массив. Каждая строка — ячейка массива $cnt = count($lines); — считаем количество полученных ячеек $rand = rand(0, ($cnt-1)); — Нумерация массива начинается с 0, и поэтому максимальное число мы делаем на 1 меньше, чем количество строк. Функция возвращает случайное число из указанного диапазона echo trim($lines[$rand]); — выводит случайную строку А эта неповторяемость в пределах чего должна быть? Можно например на каждой странице выведенный результат писать в сессию, и при каждом выводе смотреть, выводили ли мы для юзера такую строку. Это если в пределах 1 сессии. То есть юзер на сайт зашел, погулял по страницам, ушел. Завтра пришел, и ему опять может вывестись то, что уже было показано. Вариант с сессиями.
session_start(); //НА всех страницах до любого вывода.
$lines = file(‘file.txt’);
$cnt = count($lines);
if (!isset($_SESSION[‘lines’]))
$_SESSION[‘lines’] = array();
>
$i = 1;
do
if ($i > $cnt)//Если мы прокрутили цикл $cnt(количество строк) раз, то выходим, так как может быть банальное зацикливание, если юзеру уже показаны все строки.
$stop = 1;
break;
>
$rand = rand(0, ($cnt-1));
$line = trim($lines[$rand]);
$i++;
>
while (in_array($line, $_SESSION[‘lines’]));//пока полученная строка есть в массиве уже показанных значений — крутим цикл в поисках нового:)
if (!isset($stop))
echo $line; // выводит случайную строку
$_SESSION[‘lines’][] = $line;
>
?>
Метод этот не совершенен, так как может к примеру 10 раз подряд выбрать из файла ту строку, которая была показана на предыдущей страницы. А так как мы такое не показываем и у нас стоит ограничитель, то мы просто ничего не покажем юзеру. Чем больше строк в файле, тем меньше вероятности того, что юзеру ниче не покажется. Ну то есть в файл накидываем 500 строк. Ну максимум юзер сделает 100 переходов. Даже в этом случае на последнем странице вероятность попасть в уже показанную строку всего лишь 20%.
Урок по программированию на PHP для начинающих #5 — изучаем массивы и выводим случайную строку из файла.
В сегодняшнем уроке мы с вами научимся работать с файлами и создадим скрипт, который будет выводить случайную цитату.
Для начала нам с вами нужно будет разобраться с массивами и понять, что это такое. Массив представляет собой структуру данных, которая хранит одно или несколько значений в одном месте. Например, если вы директор школы, то нет смысла хранить имена учеников в разных переменных. Лучше мы создадим массив с их именами.
Мы создаем массив с помощью следующей конструкции:
Обе конструкции говорят о том, что переменная STUDENTS — это массив данных. В переменной STUDENTS теперь хранится много значений, доступ к каждому осуществляется по номеру (в программировании это называется индексом). Например:
Теперь у нас в массиве STUDENT хранится 3 значения: Маша, Петя и Ваня.
Важно! В программирование нумерация начинается не с ЕДИНИЦЫ (1), а с НУЛЯ (0). Таким образом, чтобы, например, вывести первое значение массива STUDENT на экран, нужно сделать так:
Вот стандартная конструкция массива:
Для того, чтобы подсчитать количество элементов в массиве существует функция COUNT. Она принимает массив, в котором нужно посчитать количество, и возвращает числовое значение. Например, код:
Выведет на экран цифру 3 (так как у нас 3 значения массива).
Ассоциативные массивы
В ассоциативном массиве ключ связан со значением. Если вы хотите сохранить заработную плату своих сотрудников в массив, то числовой индекс будет не лучшим выбором, так как в них можно запутаться. Вместо этого мы могли бы использовать имена сотрудников в качестве ключей в нашем ассоциативном массиве, а значением будет их зарплата.
echo «Петя получает — » . $salaries[«Петя»] . » рублей
«;
echo «Вася получает — » . $salaries[«Вася»] . » рублей
«;
echo «А Ваня получает всего — » . $salaries[«Ваня»] . » рублей
«;
echo «Даша в этом месяце не работала, поэтому — » . $salaries[«Даша»];
На этом заканчиваем массивы, думаю вы во всем уже разобрались, ведь тут все достаточно просто. Всегда используйте массивы если у вас много значений, которые требуется где-то хранить.
Теперь переходим к практическому примеру — выводим случайную строку (цитату) из файла.
Вывод случайно цитаты
Полный обзор функций по работе с файлами мы рассмотрим с вами в следующих уроках. Сейчас же мы познакомимся всего с парой функций, которые нам понадобятся.
Итак, создаем файл citations.txt (обычный текстовый файл с помощью блокнота), в который записываем пару цитат (каждую с новой строки, одна цитата — одна строка).
Теперь создаем наш скрипт. Я назову его index.php. В нашем случае (расскажу об этом в следующих уроках), файл с цитатами и наш скрипт должны лежать в одной папке.
Теперь переходим к написанию нашего скрипта.
В данном случае нам понадобилось всего 3 строчки кода. Расскажу про каждую.
Функция FILE считывает значение указанного файла и возвращает каждую строку в отдельный элемент массива. Таким образом, у нас массив $citations имел следующие элементы:
$citations[0] = «- Мир не в книгах и картах, он там — за окном!»;
$citations[1] = «То, во что ты веришь, становится твоим миром.»;
$citations[2] = «Всякий человек сам себя воспитать должен…»;
Функция ARRAY_RAND возвращает индекс случайного элемента из переданного ему массива. В нашем случае мы передали в функцию ARRAY_RAND массив $citations и функция выбрала один случайный из трех наших элементов. И этот элемент массива мы вывели на экран с помощью функции ECHO в 3-ей строчке.
Теперь при каждом входе на страницу скрипта вы будете видеть разные цитаты. Чем больше их в файле, тем больше разнообразных цитат вы получите на сайте.
На этом заканчиваем наш 5-ый урок.