如何从文本文件中回显随机行

Sah*_*cha 2 php file

我的文本文件格式是:

这是第一行.
这是第二行.
这是第三行.

文本文件中可能有更多行.如何使用php从文本文件的每个刷新回显一个随机行.所有评论都表示赞赏.谢谢

Moh*_*uur 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");
?>
Run Code Online (Sandbox Code Playgroud)

假设文件有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

这将最终从任意大小的文件中为我们提供均匀分布的随机行,而无需将整个文件实际读入内存.

我希望它会有所帮助.

  • +1用于实现效率问题.但如果没有有效的答案,我实际上无法给你那个投票. (2认同)

Joh*_*nde 7

对这种情况采取的一般方法是:

  1. 使用将行读入数组 file()
  2. echo 使用随机数组值 array_rand()


您的代码可能如下所示:

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

echo $lines[array_rand($lines)];
Run Code Online (Sandbox Code Playgroud)

  • 指数内存和CPU使用.我不推荐它. (3认同)