【问题标题】:How to echo random line from text file如何从文本文件中回显随机行
【发布时间】:2012-08-25 03:46:32
【问题描述】:

我的文本文件格式是:

这是第一行。
这是第二行。
这是第三行。

文本文件中可能有更多行。如何使用 php.ini 在每次刷新文本文件时回显一个随机行。 所有 cmets 都表示赞赏。谢谢

【问题讨论】:

  • 虽然这可能适用于少量行,但如果您想要多行的解决方案,请考虑使用数据库。

标签: php file


【解决方案1】:

我们说的文件有多大?简单的方法是将整个文件作为字符串数组加载到内存中,然后选择一个从 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

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

我希望它会有所帮助。

【讨论】:

  • +1 用于实现效率问题。但如果没有有效的答案,我实际上不能给你投票。
  • 是的,我曾经在一次采访中回答过一个类似的问题。很有趣..如果您有兴趣,我会发布完整的解决方案。
  • 如果您有解决方案并且它回答了问题,请发布。否则,就这样吧……
【解决方案2】:

解决这种情况的一般好方法是:

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


您的代码可能如下所示:

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

echo $lines[array_rand($lines)];

【讨论】:

  • 指数型内存和 CPU 使用率。我不会推荐它。
  • You've made the news。你是明星;)
  • 啊,抄袭。最真诚的奉承!
  • 是的,确实是 amico mio ;) 以为我会为你带来一点生意。哦,我是 +1 的人 - 哈哈,而不是“其他人”。爱我作为超人的日子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2015-11-26
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多