2012-04-21 43 views
6

Tôi tự hỏi về cách "tốt hơn" để kéo một hình ảnh ngẫu nhiên từ một thư mục.PHP kéo hình ảnh ngẫu nhiên từ thư mục

Giống như nói, để có php chỉ cần chọn một hình ảnh ngẫu nhiên từ thư mục thay vì tìm kiếm và tạo một mảng của nó.

ở đây là làm thế nào tôi làm điều đó ngày nay

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

Trả lời

11

Hãy thử điều này:

<?php 

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

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

** câu trả lời của bạn rất hay và ngắn! ** nhưng có vấn đề! nếu thư mục hình ảnh chứa một số lượng lớn hình ảnh (1K), [scandir] (http://php.net/manual/en/function.scandir.php) sẽ tải tất cả chúng vào một mảng. Trong khi bạn chỉ cần một hình ảnh. Có cách nào để cải thiện câu trả lời của bạn không? Và nếu bạn có thể bọc nó trong một chức năng với tùy chọn để có được một số lượng giới hạn của hình ảnh. tức là '$ return_images_count = 10;', ý tôi là một phần được giải thích trong [câu hỏi này] (https://stackoverflow.com/q/10642777/7735285). + 'opendir' trông nhanh hơn trong lược tả. – wpcoder

1

Dưới đây danh sách hình ảnh đang validate bằng cách mở rộng ảnh.

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

thay thế 'hình ảnh' bằng thư mục của bạn.

0

Tôi đã tìm kiếm trên internet trong nhiều giờ để kết thúc triển khai mã theo những gì tôi muốn. Tôi đã tập hợp các câu trả lời khác nhau mà tôi tìm thấy trực tuyến. Đây là mã:

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

Sử dụng phương pháp này, tôi đã có thể thực hiện opendir không có lỗi (như glob() đã không làm việc cho tôi), tôi đã có thể để kéo 5 hình ảnh cho một bộ sưu tập băng chuyền, và thoát khỏi hình ảnh trùng lặp và sắp xếp các giá trị trống. Một nhược điểm của việc sử dụng phương pháp của tôi là số lượng hình ảnh thay đổi giữa 3 và 5 hình ảnh trong thư viện, có thể do các giá trị trống bị xóa. Mà không làm phiền tôi quá nhiều khi nó hoạt động khi cần thiết. Nếu ai đó có thể làm cho phương pháp của tôi tốt hơn, tôi chào đón bạn làm như vậy. Ví dụ hoạt động (thư viện băng chuyền đầu tiên ở đầu trang web): Eastfield Joinery

Các vấn đề liên quan