PHP随机链接没有重复

时间:2012-09-04 22:13:07

标签: 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>

3 个答案:

答案 0 :(得分:2)

由于用户不知道链接在文本文件中的顺序是什么,如果您按顺序读取所述链接,它们看起来会“随机”(并且您可以在首次创建文件时将它们随机播放)。

所以你可以:

  • 在会话中保存最后一个链接的索引
  • 将链接索引链接到系统时间。这不会阻止重复,但可以保证没有两个链接相同,除非您在恰好适当的时间后点击“刷新”。

方法1:

$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_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-remove处重新出现,如上面的“4”(... 4 1 4 ...);如果确实如此,至少$nl次访问,您再也不会再看到它了。

同时

  1. 您不应在Header()标记内使用<BODY>。完全删除<BODY>
  2. 如果您处于脚本的自然末端,则无需使用exit():脚本将自行退出。

答案 1 :(得分:1)

我能想到的最简单的方法就是使用cookie。

互联网上有很多教程,如下所示: http://www.w3schools.com/php/php_cookies.asp

例如:

<?php
if (isset($_COOKIE["vistList"]))
  $visited = split(","$_COOKIE["visitList"]);
  foreach ($visited as &$value) {
    if ($value == /* new site url */) {
      //Find a new one
    }
  }
else
  $expire=time()+60*60*24*30;
  setcookie("vistList", "List-of-visited-URLs, separated-by-commas", $expire);
?>

我没有机会测试这段代码,但希望它可以给你一些想法。

如评论中所述,使用php会话可以完成同样的事情:

<?php
session_start();
if (isset($_SESSION["vistList"]))
  $visited = split(","$_SESSION["visitList"]);
  foreach ($visited as &$value) {
    if ($value == /* new site url */) {
      //Find a new one
    }
  }
else
  $_SESSION['vistList']=/* new site URL */
?>

答案 2 :(得分:1)

我会使用PHP会话来执行此操作。看看this example

在会话变量中存储可用页面数组。每次获得页面时,都会从阵列中删除该页面。当数组为空时,您将从原始源重新重置它。

以下是您的代码的外观:

session_start();
if (empty($_SESSION["pages"]))
    $_SESSION["pages"] = file("randomlinks.txt");

$nl = count($_SESSION["pages"]);
$np = mt_rand(0, $nl-1);

// get the page, remove it from the array, and shift all higher elements down:
list($url) = array_splice($_SESSION["pages"], $page, 1);

die(header("Location: $url"));