2012-04-21 4 views
6

Mi chiedo come sia possibile "tirare" un'immagine casuale da una cartella.PHP estrarre un'immagine casuale dalla cartella

Come dire, per avere php basta selezionare un'immagine casuale dalla cartella invece di cercare e creare un array di esso.

ecco come lo faccio oggi

<?php 
    $extensions = array('jpg','jpeg'); 
    $images_folder_path = ROOT.'/web/files/Header/'; 
    $images = array(); 
    srand((float) microtime() * 10000000); 

    if ($handle = opendir($images_folder_path)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       $ext = strtolower(substr(strrchr($file, "."), 1)); 
       if(in_array($ext, $extensions)){ 
       $images[] = $file; 
       } 
      } 
     } 
    closedir($handle); 
    } 
    if(!empty($images)){ 
     $header_image = $images[array_rand($images)]; 
    } else { 
     $header_image = ''; 
    } 
?> 

risposta

11

Prova questa:

<?php 

$dir = "images/"; 
$images = scandir($dir); 
$i = rand(2, sizeof($images)-1); 
?> 

<img src="images/<?php echo $images[$i]; ?>" alt="" /> 
+0

** la tua risposta è bella e breve! ** ma c'è un problema! se la directory delle immagini contiene un gran numero di immagini (1K), [scandir] (http://php.net/manual/en/function.scandir.php) le caricherà tutte in un array. Mentre è necessaria una sola immagine. C'è un modo per migliorare la tua risposta? E se riesci a racchiuderlo in una funzione con l'opzione di ottenere un numero limitato di immagini. e '$ return_images_count = 10;', Quello che intendo è parzialmente spiegato in [questa domanda] (https://stackoverflow.com/q/10642777/7735285). + 'opendir' sembra più veloce nella profilazione. – wpcoder

1

lista sotto delle immagine del codice di convalida per estensione dell'immagine.

<?php function validImages($image) { $extensions = array('jpg','jpeg','png','gif'); if(in_array(array_pop(explode(".", $image)), $extensions)) { return $image; } } $images_folder_path = ROOT.'/web/files/Header/'; $relative_path = SITE_URL.'/web/files/Header/'; $images = array_filter(array_map("validImages", scandir($images_folder_path))); $rand_keys = array_rand($images,1); ?> <?php if(isset($images[$rand_keys])): ?> <img src="<?php echo $relative_path.$images[$rand_keys]; ?>" alt="" /> <?php endif; ?>
1
function get_rand_img($dir) 
{ 
    $arr = array(); 
    $list = scandir($dir); 
    foreach ($list as $file) { 
     if (!isset($img)) { 
      $img = ''; 
     } 
     if (is_file($dir . '/' . $file)) { 
      $ext = end(explode('.', $file)); 
      if ($ext == 'gif' || $ext == 'jpeg' || $ext == 'jpg' || $ext == 'png' || $ext == 'GIF' || $ext == 'JPEG' || $ext == 'JPG' || $ext == 'PNG') { 
       array_push($arr, $file); 
       $img = $file; 
      } 
     } 
    } 
    if ($img != '') { 
     $img = array_rand($arr); 
     $img = $arr[$img]; 
    } 
    $img = str_replace("'", "\'", $img); 
    $img = str_replace(" ", "%20", $img); 
    return $img; 
} 


echo get_rand_img('images'); 

sostituire "immagini" con la cartella.

0

Ho cercato su Internet per ore per implementare il codice per quello che volevo. Ho messo insieme le parti di varie risposte che ho trovato online. Ecco il codice:

<?php 
    $folder = opendir("Images/Gallery Images/"); 
    $i = 1; 
    while (false != ($file = readdir($folder))) { 
     if ($file != "." && $file != "..") { 
      $images[$i] = $file; 
      $i++; 
     } 
    } 
    //This is the important part... 
    for ($i = 1; $i <= 5; $i++) { //Starting at 1, count up to 5 images (change to suit) 
     $random_img = rand(1, count($images) - 1); 
     if (!empty($images[$random_img])) { //without this I was sometimes getting empty values 
      echo '<img src="Images/Gallery Images/' . $images[$random_img] . '" alt="Photo ' . pathinfo($images[$random_img], PATHINFO_FILENAME) . '" />'; 
      echo '<script>console.log("' . $images[$random_img] . '")</script>'; //Just to help me debug 
      unset($images[$random_img]); //unset each image in array so we don't have double images 
     } 
    } 
?> 

Usando questo metodo sono stato in grado di implementare opendir senza errori (come glob() non funzionava per me), mi è stato in grado di tirare 5 immagini per una galleria giostra, e sbarazzarsi di immagini duplicate e ordinare i valori vuoti. Uno svantaggio di usare il mio metodo è che il numero di immagini varia tra 3 e 5 immagini nella galleria, probabilmente a causa della rimozione dei valori vuoti. Il che non mi ha infastidito troppo visto che funziona come necessario. Se qualcuno può migliorare il mio metodo, ti do il benvenuto. Esempio di lavoro (la prima galleria di caroselli nella parte superiore del sito Web): Eastfield Joinery