PHP随机链接不重复

标签 php random

我的PHP很差,但我正在尽力提高!

我正在尝试编写一个非常简单的 php 脚本,该脚本从文本文件列表中加载随机 html 页面。

一旦人们查看了 html 页面,他们就会链接回 random.php 文件并加载另一个页面......这可以永远持续下去。

我正在使用文本文件列表,因为我会定期添加更多页面。我的问题是我的代码中没有任何地方可以防止重复访问!现在我只有大约 8 个链接,并且不止一次我连续“随机”出现了相同的链接 3 次:( 希望我可以添加一些简单的内容以防止重复,如果所有链接均已查看,然后重置。非常感谢:)

    <body>

    <?php
    $urlist=file("randomlinks.txt");
    $nl=count($urlist);
    $np=rand(0,$nl-1);
    $url=trim($urlist[$np]);
    header("Location: $url");
    exit;
    ?>

    </body>

最佳答案

由于用户不知道链接在文本文件中的顺序,因此如果您按顺序阅读所述链接,它们会显得“随机”(并且您可以在首次创建文件时打乱它们的顺序)。

所以你可以:

  • 在 session 中保存最后看到的链接的索引
  • 将链接索引链接到系统时间。这并不能防止重复,但可以保证没有两个链接是相同的,除非您在正确的时间后点击“刷新”。

方法一:

$urlist=file("randomlinks.txt");
$nl=count($urlist);

session_start();
if (!isset($_SESSION['link'])) // If link is not in session
    $_SESSION['link'] = 0;    // Start from 0 (the first)
$np = $_SESSION['link']++;    // Next time will use next
$_SESSION['link'] %= $nl;     // Start over if nl exceeded

$url=trim($urlist[$np]);
Header("Location: $url");

方法2:

...
$nl=count($urlist);
$np = time() % $nl;           // Get number of seconds since the Epoch,
                              // extract modulo $nl obtaining a number that
                              // cycles between 0 and $nl-1, every $nl seconds
$url=trim($urlist[$np]);
Header("Location: $url");

另一种方法是记住最后看到的 N 个链接 - 但为此,您需要一个 session 变量 - 以免过早再次获取它们。

session_start();
if (!isset($_SESSION['urlist']))       // Do we know the user?
    $_SESSION['urlist'] = array();     // No, start with empty list
if (empty($_SESSION['urlist']))        // Is the list empty?
{
    $_SESSION['urlist'] = file("randomlinks.txt");   // Fill it.
    $safe = array_pop($_SESSION['urlist']);
    shuffle($_SESSION['urlist']);           // Shuffle the list
    array_push($_SESSION['urlist'], $safe);
}
$url = trim(array_pop($_SESSION['urlist']));

如果您有五个 URL 1、2、3、4 和 5,您可能会得到:

1 5 3 4 2 1 4 2 5 3 1 2 3 5 4 1 4 3 2 5 1 4 ...

...列表是 N-1 随机的:-),所有链接出现的频率相同,相同的链接最多可能会在 2 次删除时重新出现,就像上面的“4”(...4 1 4...);如果是这样,您至少在$nl内再也见不到它了访问。

还有

  1. 您不应该使用Header()从内部 <BODY>标签。删除<BODY>总共。
  2. 您不需要使用 exit()如果您处于脚本的自然结尾:脚本将自行退出。

关于PHP随机链接不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272050/

相关文章:

php - 使用 PHP DOM 添加指向元素的链接

python - 任何编程语言中具有约束的随机数生成

php - 将 preg_match() 与 REGEX 表达式一起使用时的未知修饰符 '('

php - 使用多个条件过滤 MySQL 查询

php - 无法使用 PDO 连接到 Google Cloud SQL

php - 搜索多列 mysql 和 php

c++ - boost 随机生成器返回相同的值

php - 使用概率分布生成随机数

Objective-c EXC_BAD_ACCESS(代码=2,地址=0x42)

haskell - 随机列表,其中每个元素与前一个元素最多相差 1