-1

内部に〜10.000行のファイルがあります。ユーザーが自分の Web サイトにアクセスするたびに、その中からランダムに 10 行を自動選択します。
現在使用しているコード:

$filelog = 'items.txt';
$random_lines = (file_exists($filelog))? file($filelog) : array();
$random_count = count($random_lines);
$random_file_html = '';
if ($random_count > 10)
{
    $random_file_html = '<div><ul>';
    for ($i = 0; $i < 10; $i++)
    {
        $random_number = rand(0, $random_count - 1); // Duplicate are accepted
        $random_file_html .= '<li>'.$random_lines[$random_number]."</li>\r\n";
    }
    $random_file_html .= '</ul>
    </div>';
}

1000 行未満であれば、すべて問題ありません。しかし今、1000行で。それは私のウェブサイトを大幅に遅くします。
次のような他の方法を考えていること:

ファイルを 50 ファイルに分割し、それらをランダムに選択し、選択したファイル内の 10 行をランダムに選択します。
-- または --
合計行 (アイテム) を知っていた。ランダムに 10 個の数字を作成し、ファイルの使用を読み取ります

$file = new SplFileObject('items.txt');
$file->seek($ranđom_number);
echo $file->current();

(私のサーバーはどのタイプの SQL もサポートしていません)

たぶん、私に最適な他の方法があります。私の問題に最適な方法は何ですか? どうもありがとうございました!

4

3 に答える 3

0

ファイルの内容を調整できる場合は、各行を単純にパディングして、共通の長さになるようにします。その後、ランダム アクセスを使用してファイル内の行にアクセスできます。

  $lineLength = 50; // this is the assumed length of each line

  $total = filesize($filename);
  $numLines = $total/$lineLength;

  // get ten random numbers
  $fp = fopen($filename, "r");
  for ($x = 0; $x < 10; $x++){
       fseek($fp, (rand(1, $numLines)-1)*$lineLength, SEEK_SET);
       echo fgets($fp, 50);
  }
  fclose($fp);
于 2013-08-13T15:31:28.597 に答える