通过PHP随机化目录中的照片

时间:2013-11-14 06:36:47

标签: php random photo

我有以下代码,可以在每次点击刷新按钮时随机化我在'photos'文件夹中的照片。我知道这可能不是最有效的编码方式,但就我的问题而言,它可行。我正在寻找有关我的PHP代码的帮助,这将使照片更随机。我目前在文件夹中有200多张图片,并且经常会拍摄比我想要的更多的图片。我可以做些什么改变? (PS。忽略我正在玩的AJAX / JavaScript)

<html> 

<head> 
<title>Pictures!</title> 
    <style type="text/css">
    body{ background-color:D3DFDE; }
    </style>
    <script type="text/javascript"      src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
</head> 
<body> 
<div id='main'>
<?php 
function randomimages(){ 
    $dirname = isset($_REQUEST['dir'])? $_REQUEST['dir'] : './photos/'; 
    $numimages = isset($_REQUEST['num'])? $_REQUEST['num'] : 1; 
    $pattern = '#\.(jpg|jpeg|png|gif|bmp)$#i'; 
    $files = array(); 
    if($handle = opendir($dirname)){ 
        while(($file = readdir($handle)) !== false){ 
            if(preg_match($pattern, $file)){ 
                array_push($files, "<center><img src='" . $dirname . $file . "' alt='' /></br><br/><hr/></center>"); 
            } 
        } 
        closedir($handle); 
        shuffle($files); 
    } 
    return implode("<center><br/>", array_slice($files, 0, $numimages)) . "<br/> </center>"; 
} 
?>
<!-- <center><a id="myButton" href="#">MAS PICTURES!</a></center> -->
<center><input type='button' onClick='window.location.reload(true)' value='MAS PICTURES!!!' style="height:200px; width:150px" /></center>
<hr/>
<script type="text/javascript">
        $(function() {
      $("#myButton").click(function() {
        $("#main").load("index.php");
      });
    });
</script>
<?php echo randomimages(); ?>
<center>Created by: Matt & Joe</center>
</div>


</body> 
</html>

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  1. 通过不反复读取目录来优化代码。您可以通过读取目录一次(然后将条目作为数组存储在APC缓存中)来执行此操作。设置此APC密钥的超时,以便偶尔破坏缓存。
  2. 调用`mt_rand`函数,min为'0`,max为`count(array)-1`并访问该索引。
  3. 从目录中读取的通用代码可以如下(需要修改以满足您的需求):

    <?php
    function &list_directory($dirpath) {
        if (!is_dir($dirpath) || !is_readable($dirpath)) {
            error_log(__FUNCTION__ . ": Argument should be a path to valid, readable directory (" . var_export($dirpath, true) . " provided)");
            return null;
        }
        $paths = array();
        $dir = realpath($dirpath);
        $dh = opendir($dir);
        while (false !== ($f = readdir($dh))) {
            if (strpos("$f", '.') !== 0) { // Ignore ones starting with '.'
                $paths[] = "$dir/$f";
            }
        }
        closedir($dh);
        return $paths;
    }
    

答案 1 :(得分:1)

提供变量$ dirpath

的目录完整路径
$image_source_array=scandir($dirpath);
sort($image_source_array);

使用mt_rand函数,min为0,max为count($image_source_array)-1,并从数组中访问该索引以获取图像名称

然后使用$ dirpath / image名称访问图像,每次都会得到随机图像

创建这样的函数,它将是最短的approch

function randomimages() {
    $dirname = isset($_REQUEST['dir']) ? $_REQUEST['dir'] : './photos/';
    $image_source_array = scandir($dirname);
    sort($image_source_array);
    $image_count = count($image_source_array) - 1;
    $rand_index = mt_rand(3, $image_count);
    //Starting with 3 because scandir returns directory also in the 2 indexes like '.' and '..'
    $rand_image_path = $dirname . $image_source_array[$rand_index];
    return $rand_image_path;
}

答案 2 :(得分:0)

为了简单和可重用,您可能希望将RegexIteratorDirectoryIterator一起使用:

function randomimages($path, $num_images)
{
    $images = array();

    foreach (new RegexIterator(new DirectoryIterator($path),
                               '#\.(jpe?g|gif|png|bmp)$#i') as $file) {
        $images[] = $file->getPathname();
    }

    shuffle($images);

    return array_slice($images, 0, $num_images);
}

使用:

$path = isset($_REQUEST['dir']) ? $_REQUEST['dir'] : './photos/';
$num_images = isset($_REQUEST['num']) ? $_REQUEST['num'] : 1;

print implode('<br />', randomimages($path, $num_images));