2

更新ボタンがクリックされるたびに、「写真」フォルダーにある写真をランダム化する機能する次のコードがあります。これがコード化する最も効率的な方法ではないことはわかっていますが、私の問題では機能します。写真をよりランダムにする 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>
4

3 に答える 3

2

次のことができます。

  1. ディレクトリを何度も読み取らないようにして、コードを最適化します。ディレクトリを1回読み取ることでこれを行うことができます(そして、エントリを配列としてAPCキャッシュに保存します)。この APC キーのタイムアウトを設定して、たまにキャッシュを破棄します。
  2. min を `0`、max を `count(array)-1` として `mt_rand` 関数を呼び出し、そのインデックスにアクセスします。

ディレクトリから読み取る一般的なコードは次のようになります (ニーズに合わせて変更する必要があります)。

<?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;
}
于 2013-11-14T06:49:53.597 に答える
1

変数 $dirpath にディレクトリの完全パスを指定します

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

mt_randmin as0と max asで関数を使用count($image_source_array)-1し、配列からそのインデックスにアクセスして画像名を取得します

$dirpath/image という名前で画像にアクセスすると、毎回ランダムな画像が取得されます

このような関数を作成すると、最短のアプローチになります

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;
}
于 2013-11-14T07:09:53.187 に答える
0

シンプルさと再利用性のために、次のものとRegexIterator一緒に使用することをお勧めしDirectoryIteratorます。

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));
于 2013-11-14T07:54:55.877 に答える