【问题标题】:Random image from directory with no repeats?目录中的随机图像没有重复?
【发布时间】:2015-07-31 02:49:02
【问题描述】:

我能够使用我的代码成功地从我的“上传”目录中获取随机图像,但问题是它有多个图像重复。我将重新加载页面,相同的图像将显示 2 - 15 次而不会更改。我考虑过为上一张图片设置一个 cookie,但如何执行此操作让我大吃一惊。我会在这里发布我所拥有的,任何帮助都会很棒。

$files = glob($dir . '/*.*');
$file = array_rand($files);
$filename = $files[$file];
$search = array_search($_COOKIE['prev'], $files);

if ($_COOKIE['prev'] == $filename) {
    unset($files[$search]);
    $filename = $files[$file];
    setcookie('prev', $filename);
}

【问题讨论】:

  • 我猜 shuffle($files) 然后遍历 $files,不会这样做。

标签: php session cookies random session-cookies


【解决方案1】:

类似于 slicks answer,但在会话方面更简单一些:

您可以使用仅基于rand 重新排序的自定义过程,而不是使用array_rand 来随机化数组:

$files = array_values(glob($dir . '/*.*'));
$randomFiles = array();
while(count($files) > 0) {
    $randomIndex = rand(0, count($files) - 1);
    $randomFiles[] = $files[$randomIndex];
    unset($files[$randomIndex]);
    $files = array_values($files);
}

这很有用,因为您可以为 rand 函数设定种子,这意味着它将始终生成相同的随机数。只需添加(在随机化数组之前):

if($_COOKIE['key']) {
     $microtime = $_COOKIE['key'];
else {
     $microtime = microtime();
     setcookie('key', $microtime);
}

srand($microtime);

这确实意味着有人可以通过操纵 cookie 来操纵图像的顺序,但如果你对此没问题,这应该可以工作。

【讨论】:

  • 循环永远返回undefined offset: 0
  • 你说得对,我应该测试一下。它现在有效,我已经更新了我的答案。爱迪生:ideone.com/L0hDEF
  • 我会用什么来输出图像?
【解决方案2】:

所以您希望每个请求都没有重复?使用会话。避免重复的最好方法是有两个数组(桶)。第一个将包含您将从中选择的所有可用元素。第二个数组暂时为空。

然后开始从第一个数组中挑选项目并将它们从第一个数组移动到第二个数组。 (删除和array_push 到第二个)。循环执行此操作。在下一次迭代中,第一个数组不会包含您已经选择的元素,因此您将避免重复。

一般。将项目从存储桶移动到存储桶,您就完成了。此外,您可以将结果存储在会话中而不是 cookie 中吗?服务器端存储更适合这类事情。

【讨论】:

  • 我想使用会话,但由于某种原因,它们不能使用 MAMP。
  • 另外,我会将存储桶技术应用于哪些变量?
  • 只需创建两个数组$array1 = []; $array2 = []; 并将它们弄乱。把注意力集中在你的第一个问题上。然后你可以考虑会话或cookies。另一个问题 - 会话在 MAMP 上不起作用?我敢肯定他们这样做,但你做错了什么。 /var/log/apache2 和学习讲座。
  • 我添加session_start(),然后用$_SESSION['name'] = "value";声明一个会话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2021-10-05
  • 1970-01-01
  • 2021-01-03
  • 2018-03-08
  • 2012-09-21
相关资源
最近更新 更多