4

私のテキストファイル形式は次のとおりです。

これが最初の行です。
これは2行目です。
これは3行目です。

テキストファイルにさらに行がある可能性があります。phpを使用してテキストファイルから更新するたびにランダムな1行をエコーする方法。すべてのコメントをいただければ幸いです。ありがとう

4

2 に答える 2

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");
?>

ファイルに 10 行あるとします。行 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

これにより、実際にファイル全体をメモリに読み込むことなく、任意のサイズのファイルから均一に分散されたランダムな行が得られます。

それが役立つことを願っています。

于 2012-08-25T03:55:55.073 に答える
9

この種の状況に対する一般的に良いアプローチは次のとおりです。

  1. を使用して行を配列に読み込みますfile()
  2. echoを使用してランダム配列値を出力しますarray_rand()


コードは次のようになります。

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

echo $lines[array_rand($lines)];
于 2012-08-25T03:47:32.893 に答える