【发布时间】:2012-08-25 03:46:32
【问题描述】:
我的文本文件格式是:
这是第一行。
这是第二行。
这是第三行。
文本文件中可能有更多行。如何使用 php.ini 在每次刷新文本文件时回显一个随机行。 所有 cmets 都表示赞赏。谢谢
【问题讨论】:
-
虽然这可能适用于少量行,但如果您想要多行的解决方案,请考虑使用数据库。
我的文本文件格式是:
这是第一行。
这是第二行。
这是第三行。
文本文件中可能有更多行。如何使用 php.ini 在每次刷新文本文件时回显一个随机行。 所有 cmets 都表示赞赏。谢谢
【问题讨论】:
我们说的文件有多大?简单的方法是将整个文件作为字符串数组加载到内存中,然后选择一个从 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 行的概率为:
1
1/2 * P(1)
2/3 * P(2)
(N-1)/N * P(N-1) = 1/N
这最终将为我们提供一个来自任意大小文件的均匀分布的随机行,而无需实际将整个文件读入内存。
我希望它会有所帮助。
【讨论】:
解决这种情况的一般好方法是:
file() 将行读入数组
echo 使用array_rand() 输出随机数组值
您的代码可能如下所示:
$lines = file('my_file.txt');
echo $lines[array_rand($lines)];
【讨论】: