php从目录生成随机图像

时间:2012-08-09 02:44:04

标签: php random directory

我必须从目录生成随机图像。我知道哪个很简单,

   $dire="images/";
   $images = glob($dire. '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
   $randomImage = $images[array_rand($images)];
   <input type="image" src="<?=$randomImage;?>" alt="<?=$randomImage;?>" />

但是我必须确保该目录中的每个图像在随机生成第二次之前至少选择了一次。以上代码仅显示任何随机图像。

我的想法是,我必须将随机图像存储在一个数组中,并且每次使用新创建的随机图像检查数组。如果新的随机图像不在该数组中,我需要显示该图像,否则我必须找到另一个图像。

我用上面的想法创建了下面的代码。

  $allimgs=array();
  $dire="images/";
  $images = glob($dire. '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
  $randomImage = $images[array_rand($images)];

   if(!in_array($randomImage,$allimgs))
   {
     $allimgs[]=$randomImage;
     <input type="image" src="<?=$randomImage;?>" alt="<?=$randomImage;?>" />
   }

但我仍然坚持使用此代码。有人请帮忙改进这段代码吗?或任何其他想法?

感谢。

4 个答案:

答案 0 :(得分:3)

一种解决方案可能是这样做:

<?
// initialize $images
shuffle($images);
$randomImage = array_pop($images);
?>
<input type="image" src="<?=$randomImage;?>" alt="<?=$randomImage;?>" />

这将保证您只能以随机顺序使用每个图像一次。

答案 1 :(得分:2)

array_rand的一个替代方法是shuffle:

$dire="images/";
$images = glob($dire. '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
shuffle($images);

然后显示下一个随机图像:

$randomImage=array_pop($images);

当数组为空时,再次调用初始化代码。所以把它放在一起:

$images=array()  //Initialize once at top of script
$dire="images/";
...
if(count($images)==0){
  $images = glob($dire. '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
  shuffle($images);
  }
$randomImage=array_pop($images);

(我故意重复了glob(),以便在第二次迭代时发现任何新图像。)

P.S。我假设你明白,默认情况下,PHP是无状态的。如果每次用户访问某个页面(例如旋转横幅广告)时都应该为每个用户提供不同的图像,那么代码几乎相同,但将$images数组移动到$_SESSION。< / p>

答案 2 :(得分:0)

这些代码有助于从文件夹

中提取随机图像
       <?php 
            $files = glob('photos/*'); 
               natcasesort($files);      // Display images  
            foreach($files as $file) {     
               echo '<img src="' . $file . '"/>';
            }  
        ?>

答案 3 :(得分:0)

这是我的答案,似乎行之有效。它会生成一个从给定文件夹中的图像中随机生成的图像:

<?php 
$result = glob('images/*'); 
shuffle($result);
foreach($result as $result) {     
   break;     
}  
?>
<img src="<?php echo "$result"; ?>" />