使PHP包含随机函数不重复

时间:2011-08-26 10:17:06

标签: php javascript random include server-side-includes

情况

我有一个相对较短的PHP代码,我发现并调整了包含一个随机的html文件,从我的'randomizer'文件夹到我的页面。

这是代码

<?php
  error_reporting(0);
  function random_file($string){
    return ((file_exists($string))&&(preg_match('#(\.html)$#i',$string)))  ? true : false ;
  }

  define('OUTPUT_TYPE','text');

  define('RANDOM_FILES_FOLDER','randomizer/');

  $my_array = Array();
  $my_dir = RANDOM_FILES_FOLDER ;

  if ($dir = @opendir("$my_dir")) {

    while (($file = readdir($dir)) !== false) {
      if ($file != "." && $file != ".."  && !is_dir($my_dir.$file))
      {
        switch(OUTPUT_TYPE):

          case'text':
            if(random_file($my_dir.$file)){
              $my_array[] = $file;
            }
          break;

          default:
          break;

        endswitch;

      }
    }
    closedir($dir);
  }

  if(count($my_array)>0){

    $random_number = rand(0, count($my_array)-1);
    $random_file = $my_array[$random_number];

    switch(OUTPUT_TYPE):

      case'text':
        include($my_dir.$random_file);
      break;

      default:
      break;

    endswitch;

  }
?>

问题

它做它应该做的事情(也许有人可以为我修剪/优化代码)但我只有几个文件可以随机化,我不希望当我刷新或打开时,同一个文件出现两次第一天的页面。

我认为Cookie可能是答案,但不确定如何对它们做任何事情。

任何人都可以编写一个代码来添加到我这样做或提供具有所有这些属性的代码吗?请记住,它必须包含文件夹中的随机文件,我不希望我的实际页面代码中的这些文件的代码用于CMS目的

请记住,我是一名具有非常基本知识的PHP和Javascript初学者,所以请为我愚蠢。

谢谢!

2 个答案:

答案 0 :(得分:0)

非常粗糙:

session_start();
$dir = 'randomizer/';

if (empty($_SESSION['files'])) {
    $_SESSION['files'] = array_filter(scandir($dir), function ($file) use ($dir) {
        return is_file($dir . $file) && preg_match('#(\.html)$#i', $file);
    });
    shuffle($_SESSION['files']);
}

include $dir . array_shift($_SESSION['files']);

保留会话中所有候选文件的列表,逐个使用它们。这样,所有文件将在循环再次开始之前以随机顺序显示一次。如果列表非常长,则不建议使用。

值得注意的是array_filter回调语法需要PHP 5.3。

答案 1 :(得分:0)

这不是完美的方法,但它会起作用(故意简单): 在行$random_file = $my_array[$random_number];

之后加入此内容
$oldFile = ''
if(!empty($_COOKIE['oldfilename']) {
    $oldFile = $_COOKIE['oldfilename'];
}
while ($oldFile == $random_file) {
    $random_number = rand(0, count($my_array)-1);
    $random_file = $my_array[$random_number];
}
setcookie('oldfilename', $random_file);