Заставить PHP включать рандомизатор, не повторяться - PullRequest
0 голосов
/ 26 августа 2011

Ситуация

У меня есть относительно короткий 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;

  }
?>

Вопрос

Он делает то, что должен (возможно, кто-то может обрезать / оптимизировать этот код для меня), но у меня есть только несколько файлов для рандомизации, и я не хочу того жефайл появляется дважды, когда я обновляю или открываю страницу на следующий день после.

Я думаю, что куки могут быть ответом, но не уверен, как с ними что-то сделать.

Может кто-нибудь написать кусоккод, чтобы добавить к моему, чтобы сделать это или предоставить код, который имеет все эти атрибуты?имейте в виду, что он должен включать случайные файлы из папки, я не хочу, чтобы код из этих файлов был на моей реальной странице кода для целей CMS

Имейте в виду, я новичок в PHP и Javascriptс ОЧЕНЬ базовыми знаниями, поэтому, пожалуйста, выложите его для меня.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

Это не идеальный способ сделать это, но он будет работать (намеренно просто): Включить это после строки $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);
0 голосов
/ 26 августа 2011

Очень грубо:

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.

...