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


Randomize photos from a directory via PHP

我有以下代码,该代码功能强大,每次单击刷新按钮时,都会随机化"照片"文件夹中的照片。我知道这可能不是最有效的编码方式,但就我而言,它有效。我正在寻找有关我的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>

您可以执行以下操作:

  1. 通过不一遍又一遍地读取目录来优化代码。您可以通过读取一次目录来执行此操作(然后说然后将条目作为数组存储在 APC 缓存中)。为此 APC 密钥设置超时,以偶尔破坏缓存。
  2. 调用 'mt_rand' 函数,最小值为 '0',最大值为 'count(array)-1' 并访问该索引。

从目录中读取的通用代码可以如下所示(需要修改以满足您的需求):

<?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;
}

提供变量的目录完整路径$dirpath

$image_source_array=scandir($dirpath);
sort($image_source_array);

使用mt_rand函数,最小值为0,最大值为count($image_source_array)-1,并从数组访问该索引以获取映像名称

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

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

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;
}

为了简单和可重用性,您可能希望将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));