来自目录的随机图像没有重复?

时间:2015-07-31 02:49:03

标签: php session cookies random session-cookies

我成功地从我的上传内容中随机拍摄了图片。目录与我的代码,但问题是它有多个图像重复。我将重新加载页面,相同的图像将显示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);
}

2 个答案:

答案 0 :(得分:1)

类似于光滑的答案,但在会话方面稍微简单一点:

您可以使用仅基于array_rand重新排序的自定义流程,而不是使用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来操纵图像的顺序,但是如果您对此表示满意,那么这应该可行。

答案 1 :(得分:0)

所以你想要每次请求没有重复?使用会话。避免重复的最佳方法是使用两个数组(存储桶)。第一个将包含您将从中挑选的所有可用元素。第二个数组现在是空的。

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

总的来说。将物品从桶移到桶中即可完成。另外,您可以将结果存储在会话中而不是cookie中吗?服务器端存储对于这类事情更好。