我的文本文件格式爲:如何從文本文件呼應隨機線
這是第一道防線。
這是第二行。
這是第三行。
有可能是在文本文件中更多的行。如何使用php在文本文件的每個刷新上回顯一個隨機行。 所有意見都表示讚賞。由於
我的文本文件格式爲:如何從文本文件呼應隨機線
這是第一道防線。
這是第二行。
這是第三行。
有可能是在文本文件中更多的行。如何使用php在文本文件的每個刷新上回顯一個隨機行。 所有意見都表示讚賞。由於
一個總體上是好的做法,以這種情況是:
file()
echo
了隨機數組值數組array_rand()
你的代碼可能看起來像這樣:
$lines = file('my_file.txt');
echo $lines[array_rand($lines)];
指數內存和CPU使用。我不會推薦它。 – cmc
[你已經做了新聞](http://stackoverflow.com/a/26770499/1415724)。你是明星;) –
啊,抄襲。最誠懇的奉承形式! –
我們在說多大的文件?簡單的方法是將整個文件加載到內存中字符串數組,並從0隨機挑選一個數組索引爲N,表明該行..
如果該文件的大小,可以得到非常大的,那麼你就必須實行某種形式的流媒體解決方案..
下列溶液將產生一個均勻分佈的隨機線從相對大的文件,每個文件的可調節最大行大小。
<?php
function rand_line($fileName, $maxLineLength = 4096) {
$handle = @fopen($fileName, "r");
if ($handle) {
$random_line = null;
$line = null;
$count = 0;
while (($line = fgets($handle, $maxLineLength)) !== false) {
$count++;
// P(1/$count) probability of picking current line as random line
if(rand() % $count == 0) {
$random_line = $line;
}
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
fclose($handle);
return null;
} else {
fclose($handle);
}
return $random_line;
}
}
// usage
echo rand_line("myfile.txt");
?>
假設文件有十行,採摘線X的概率爲:
1
1/2 * P(1)
2/3 * P(2)
(N-1)/N * P(N-1)
= 1/N
最終會從任意大小的文件中爲我們提供均勻分佈的隨機行,而無需將整個文件實際讀入內存。
我希望這將有助於。
雖然這可能對於少數行的工作,如果你想爲多行的解決方案,可以考慮使用一個數據庫。 – 2012-08-25 03:59:02