-1

我有一个文件,里面有 ~ 10.000 行。我希望每次用户访问我的网站时,它都会在其中随机选择 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 回答
0

最快的方法显然不是根据每个用户的请求从一个包含约 10.000 行的文件中随机选择 10 行。
因为我们不知道这个“XY问题”的细节,所以不可能回答更多。

于 2013-08-13T15:25:27.323 回答
-1

尝试:

$lines = file('YOUR_TXT_FILE.txt');
$rand  = array_rand($lines);

echo $lines[$rand];

对于其中的 10 个,只需将其放入一个循环中:

$lines = file('YOUR_TXT_FILE.txt');
for ($i = 0; $i < 10; $i++) {
   $rand = array_rand($lines);
   echo $lines[$rand];
}

注意:** 上面的代码不保证 **2相同的行不会被选中。为了保证唯一性,您需要添加额外的 while 循环和一个包含所有随机生成的索引的数组,因此下次生成它并且它已经存在于数组中时,再生成另一个直到它不在数组中。

上述解决方案可能不是最快的,但可能会满足您的需求。由于您的服务器不支持任何类型的 SQL,可能切换到不同的服务器?因为我想知道您如何存储用户数据?那些也存储在文件中吗?

于 2013-08-13T15:19:55.653 回答