【问题标题】:Make PHP include randomizer not repeat itself使 PHP 包含随机化器不会重复自身
【发布时间】:2011-08-26 10:17:05
【问题描述】:

情况

我找到并调整了一个相对较短的 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 初学者,具有非常基础的知识,所以请为我低调一点。

谢谢!

【问题讨论】:

  • 所以您基本上希望我们为您开发功能?我的费率是 40 欧元/小时... ;)
  • 你只是想让下一个访问显示不同吗?
  • @Martin 我自己尝试过但失败了:(。我很乐意为您开发 HTML5 或 CCS3 中的简短 sn-ps 代码,或者如果您需要,甚至可以制作一个小的 PSD 或 SWF 文件: )
  • 当我一天访问您网站的次数超过您目录中的文件时会发生什么?
  • @Martin 它应该重新开始计数并重复文件,但只有在完成所有文件之后。

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


【解决方案1】:

非常粗糙:

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。

【讨论】:

  • 如果我关闭并重新打开浏览器,这会起作用吗?我认为只有在浏览器打开时会话才有效。
  • @amesguich 这取决于您如何配置会话。会话使用 cookie,因此任何 cookie 解决方案都有同样的问题。如果 cookie 没有明确的过期日期,它会很快被丢弃。如果您将到期日期设置得更长,它会保留。
  • 后续问题。无论中间关闭浏览器,我如何让该会话持续一周?
  • 感谢 deceze,这适用于会话,现在是问题,就像其他答案一样,我收到语法错误并且我的页面不起作用。我刚刚检查了一下,我确实运行了 PHP 5.3。
  • 你必须告诉错误是什么以及它指向哪一行。否则几乎不可能提供帮助。
【解决方案2】:

这不是做到这一点的完美方法,但它会起作用(故意简单): 在 $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);

【讨论】:

  • 在 '{' 之前缺少一个 ')'。由于我没有在 IDE 中键入此内容,因此括号匹配或引号匹配可能不准确。但是如果你想在 PHP 中工作,你应该能够解决这些语法问题。
  • 以为是问题所在,我抓住了它,这是我尝试的第一件事,但我仍然得到同样的错误
  • 我刚刚试了一下,没有出现任何语法错误。你能粘贴你的输出吗?
  • 解析错误:语法错误,第 58 行 /index.php 中的意外 T_IF(其中第 58 行是您的代码修改的第 2 行)
  • 我刚刚注意到,有一个 ';'在 $oldFile = '' 之后丢失。正如我之前提到的,我不能确定语法错误,我不习惯编写没有语法高亮和错误通知的代码(是的,我被宠坏了)
猜你喜欢
  • 2013-07-27
  • 2013-11-14
  • 2015-05-24
  • 2016-01-07
  • 1970-01-01
  • 2015-03-31
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多