Задать вопрос
@Pseudoquater

Как в PHP выдернуть рандомно уникальные строки из текстового файла?

Имеем текстовой фал с N-м количеством строк текста (строки необязательно должны быть предложениями, и необязательно со знаками препинания).
Допустим нужно выдернуть из этого файла 150 случайных строк и вывести их.

На одном из форумов увидел вот такой код (который вроде как должен как раз реализовать такую идею, однако, я попробовал - и каждый раз скрипт выводит одну-две строки текста (номер строки : текст), а остальные строки только номера строк без текста...). Помогите найти ошибку. Заранее спасибо.

-------
КОД:
<?php
# Подсчитываем кол-во строк в файле.
$f = fopen('semantic.txt', "r");
<?php
# Подсчитываем кол-во строк в файле.

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 <= 0 ) || ( $min > $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 );
?>
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
$arr = file('semantic.txt');
if(count($arr < 150)) {return false;}
shuffle($arr);
$res = array_slice($arr, 0, 150);
foreach($res as $str){
  echo $str;
}
Ответ написан
@Pseudoquater Автор вопроса
Бездарно, г-н ThunderCat!
А почему вы сами не проверяете код, когда даете ответ?! (риторический вопрос).

В вашем коде две ошибки.
1. На этапе проверки количества строк. В вашем примере он при любом раскладе выводит False (для текстового файла).
2. На этапе вывода. Так текстовые строки не выводятся!

Правильное решение (без проверки количества):
$arr = file('semantic.txt');
shuffle($arr);
$res = array_slice($arr, 0, 150);
foreach($res as $str){
  echo htmlspecialchars($str) . "<br />\n";
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы