2011-12-20 11 views
0

私はサーバー上のフォルダから4つのランダムな写真を引っ張ってdivに表示するサイト用の小さなモジュールを構築しようとしています。何が起こっているのかは、同じ4枚の写真が呼び出されていることです。どうやって4種類の写真を呼べますか?フォルダからの4つのランダム写真を表示するPHPスクリプトは、同じ写真を表示しています4回

相続人random.phpファイル:

<?php 
$folder = '.'; 

$extList = array(); 
$extList['jpg'] = 'image/jpeg'; 
$extList['jpeg'] = 'image/jpeg'; 

$img = null; 

if (substr($folder,-1) != '/') { 
$folder = $folder.'/'; 
} 

if (isset($_GET['img'])) { 
$imageInfo = pathinfo($_GET['img']); 
if (
    isset($extList[ strtolower($imageInfo['extension']) ]) && 
    file_exists($folder.$imageInfo['basename']) 
) { 
    $img = $folder.$imageInfo['basename']; 
} 
} else { 
$fileList = array(); 
$handle = opendir($folder); 
while (false !== ($file = readdir($handle))) { 
    $file_info = pathinfo($file); 
    if (
     isset($extList[ strtolower($file_info['extension']) ]) 
    ) { 
     $fileList[] = $file; 
    } 
} 
closedir($handle); 

if (count($fileList) > 0) { 
    $imageNumber = time() % count($fileList); 
    $img = $folder.$fileList[$imageNumber]; 
} 
} 

if ($img!=null) { 
$imageInfo = pathinfo($img); 
$contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ]; 
header ($contentType); 
readfile($img); 
} else { 
if (function_exists('imagecreate')) { 
    header ("Content-type: image/png"); 
    $im = @imagecreate (100, 100) 
     or die ("Can't initialize image stream"); 
    $background_color = imagecolorallocate ($im, 255, 255, 255); 
    $text_color = imagecolorallocate ($im, 0,0,0); 
    imagestring ($im, 2, 5, 5, "IMAGE ERROR", $text_color); 
    imagepng ($im); 
    imagedestroy($im); 
} 
} 

?> 

はここrandom.phpが呼び出されている方法は次のとおりです。あなたの乱数ジェネレータをシードする

<?php 

/* DATA */ 
$data = array(
array('COUNT', '88', 'Here are a few of them', '1, 2, 3, 4'), 
); 
?> 

<div> 
<table class="reop" border='0' width='100%' cellpadding='0' cellspacing='10'> 

<?php 
$count = 0; 
foreach($data as $row) { 
    $class = ($count % 2 == 1 ? " class='alt'" : ''); 
    echo "<tr$class>"; 
    for($j = 0; $j < count($row); $j++) { 
     if ($j!=3) { 
      echo "<td class='cell_$j'>$row[$j]</td>"; 
     } else { 


//   $avatar = ''; 
      $array = preg_split('/,/', $row[$j], -1, PREG_SPLIT_NO_EMPTY); 
      foreach ($array as $val) { 
      $avatar .= '<img src="/staffpics/random.php"> '; 
      } 
      echo "<td class='cell_$j'>$avatar</td>"; 

     } 

    } 
    echo '</tr>'; 
// $count++; 
} 

?> 

</table> 

+0

私は答えはありませんが、私は4つの画像が同じになる理由を知っています:あなたのブラウザはすべての画像をキャッシュします。サーバから画像をロードすると、同じ画像(すなわち、同じファイル名)を再びロードする必要はないことが分かる。だから多分彼らに4つの異なる名前を付けるかもしれない? –

+0

@ Mrリスター - 私の答えのように聞こえる。 –

+0

@MrLister - うーん、/ staffpics /のすべての画像の名前は[1.jpg、2.jpg。 3.jpg、...]これはあなたが意味することですか? – tronjavolta

答えて

2

あなたのページが表示されると、ほとんどのブラウザはすぐにほぼすべての4枚の写真を要求します。ピクチャをランダムに選択するコードは、unixtimeの開始から秒数を返すtime()に基づいています。同じ秒に4回を実行すると、同じ結果が4回返されます。

あなたのコード:あなたが "ランダム" の画像を取得するそのよう

// filelist starts with "0", count with "1" .. so we are off-by-one and first picture would never show without -1 
$imageNumber = rand() % (count($fileList) - 1); 
$img = $folder.$fileList[$imageNumber]; 

$imageNumber = time() % count($fileList); 
$img = $folder.$fileList[$imageNumber]; 

はのように書き換える必要があります。お使いのブラウザはまた、画像をキャッシュし、したがって、一度だけpicutreを要求し、ちょうどそのキャッシュを使用して何度も何度もその1が表示されることがあり - ミスターリスターがコメントし何も

は、完全に有効です。

最終的にはそう最終的に(まれに)同じ乱数を複数回返すことが、あなたのサーバーが同じとなってしまいます。これを回避する

は、<img src="random.php?rand=<?= rand(); ?>">


しかし、ノートでは、任意の​​と交換します写真を同じページで2回繰り返します。

これを修正するには、コードを完全に書き直す必要があります。ページをレンダリング

スクリプトが選択して何の絵は二回だけではなく、レンダリングされたページとは独立した「ランダム画像を与える」スクリプトを含むと表示されていないことを確認するために、どの画像を決定する必要があります。ここで

// find all images - case SenSItivE 
$all_images = glob("/path/to/images/*.{jpeg|jpg|png|gif}", GLOB_BRACE); 
// bring array in random order 
shuffle($all_images); 
// pick four random images - you may also use a for or foreach loop to iterate the array 
list ($img1, $img2, $img3, $img4) = $all_images; 
// write code to display four images here 
+0

@Mr Listerのコメントに説明が追加されました – Kaii

+0

彼のコードにOPにrand()がないことがわかりました! –

1

が4枚のランダムな写真をフェッチする別の方法です:

はるかに簡単に、あなたはこの試みることができる

//randomize order 
shuffle($fileList); 
//get first 4 values of array 
$randomPhotos = array_slice($fileList, 0, 4); 

をシャッフルはあなたの元の配列内の値の順序を変更しますのでご注意ください。

関連する問題