2012-04-21 9 views
6

Me pregunto acerca de una "mejor" forma de sacar una imagen aleatoria de una carpeta.imagen aleatoria de extracción de PHP de la carpeta

Como decir, para tener php simplemente seleccione una imagen aleatoria de la carpeta en lugar de buscar y crear una matriz de la misma.

aquí es cómo lo hago hoy

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

Respuesta

11

Prueba esto:

<?php 

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

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

** ¡su respuesta es buena y breve! ** ¡pero hay un problema! si el directorio de imágenes contiene una gran cantidad de imágenes (1K), [scandir] (http://php.net/manual/en/function.scandir.php) las cargará todas en una matriz. Mientras solo necesita una imagen. ¿Hay alguna manera de mejorar tu respuesta? Y si puede envolverlo en una función con la opción de obtener un número limitado de imágenes. es decir '$ returned_images_count = 10;', Lo que quiero decir se explica parcialmente en [esta pregunta] (https://stackoverflow.com/q/10642777/7735285). + 'opendir' se ve más rápido en el perfilado. – wpcoder

1

A continuación la lista de imágenes de código de validación por extensión de la imagen.

<?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'); 

reemplace 'images' con su carpeta.

0

Busqué en Internet durante horas para implementar el código a lo que quería. Reuní partes de varias respuestas que encontré en línea. Aquí está el código:

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

uso de este método yo era capaz de poner en práctica opendir sin errores (como glob() no estaba funcionando para mí), que fue capaz de sacar 5 imágenes de una galería carrusel, y deshacerse de imágenes duplicadas y ordenar los valores vacíos. Una desventaja del uso de mi método es que el recuento de imágenes varía entre 3 y 5 imágenes en la galería, probablemente debido a la eliminación de los valores vacíos. Lo cual no me molestó demasiado ya que funciona según sea necesario. Si alguien puede mejorar mi método, te invito a que lo hagas. Ejemplo de trabajo (la primera galería de carrusel en la parte superior del sitio web): Eastfield Joinery

Cuestiones relacionadas