2012-08-25 31 views
2

我的文本文件格式爲:如何從文本文件呼應隨機線

這是第一道防線。
這是第二行。
這是第三行。

有可能是在文本文件中更多的行。如何使用php在文本文件的每個刷新上回顯一個隨機行。 所有意見都表示讚賞。由於

+0

雖然這可能對於少數行的工作,如果你想爲多行的解決方案,可以考慮使用一個數據庫。 – 2012-08-25 03:59:02

回答

7

一個總體上是好的做法,以這種情況是:

  1. 使用讀線到使用file()
  2. echo了隨機數組值數組array_rand()


你的代碼可能看起來像這樣:

$lines = file('my_file.txt'); 

echo $lines[array_rand($lines)]; 
+2

指數內存和CPU使用。我不會推薦它。 – cmc

+0

[你已經做了新聞](http://stackoverflow.com/a/26770499/1415724)。你是明星;) –

+0

啊,抄襲。最誠懇的奉承形式! –

17

我們在說多大的文件?簡單的方法是將整個文件加載到內存中字符串數組,並從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的概率爲:

  • P(1)= 1
  • P(2)= 1/2 * P(1)
  • P(3 )= 2/3 * P(2)
  • P(N)= (N-1)/N * P(N-1) = 1/N

最終會從任意大小的文件中爲我們提供均勻分佈的隨機行,而無需將整個文件實際讀入內存。

我希望這將有助於。

+2

+1用於實現效率問題。但是如果沒有有效的答案,我實際上無法給你這個投票。 – Jon

+0

是的,我曾在一次採訪中回答過類似的問題。相當有趣..如果你有興趣,我會發布完整的解決方案。 –

+0

如果您有解決方案並且回答問題,請發佈。否則,讓它成爲... – Jon

相關問題