Вывод случайных изображений скриптом PHP

Приветствую Вас, уважаемые читатели и посетители блога 4remind.ru. Предлагаю вашему вниманию небольшой скрипт на PHP, который позволит выводить на страницы сайта любое изображение или фотографию в случайном порядке или, скажем другими словами, реализовать простое слайд-шоу.

Для простоты реализации поставленной задачи изображения должны располагаться в одной директории. Файлы изображений или фотографий могут иметь любые имена и любое расширение, соответствующее графическому представлению файла, например JPG, PNG, GIF и другие.

В предлагаемом ниже скрипте кроме часто употребляемых функций, нами еще будут использованы стандартные функции языка PHP, которые предназначены для работы с файловой системой и с которыми стоит для начала ознакомиться или кому-то просто вспомнить о них:

scandir( $dirName );

Эта функция позволяет получить список всех файлов и каталогов, которые расположены по пути, указанному в параметре $dirName.
Она возвращает массив, в котором содержатся имена файлов и каталогов, расположенных по пути, переданном в параметре $dirName. Если путь в параметре $dirName указан неверно, то функция вернет логическое FALSE и вдобавок сгенерирует сообщение об ошибке уровня E_WARNING (предупреждающее сообщение).

$array = pathinfo( $path );

Данная функция возвращает детальную информацию о пути к файлу, указанному в параметре $path, а конкретнее она возвращает ассоциативный массив, в котором содержится информация о пути $path.
В составе возвращаемого массива содержатся элементы: dirname, basename и extension, значения которых можно получить как показано здесь:

<?php	
   $pathDetails = pathinfo( $path );
	
   echo $pathDetails['dirname'] . "</br>";
   echo $pathDetails['basename'] . "</br>";
   echo $pathDetails['extension'] . "</br>";
?> 

Например, если в параметре $path будет содержаться путь к файлу, такой как /www/htdocs/photos/image1.jpg, то на выходе мы получим следующие данные:

dirname: /www/htdocs/photos/
basename: image1.jpg
extension: jpg

Кроме описанных выше функций стоит упомянуть еще одну, которая будет использоваться нами для генерации случайных значений, необходимых нам, чтобы файлы изображений выбирались в случайном порядке:

mt_rand( [int min, int max] )

Эта функция генерирует _наилучшее_ случайное значение. Она по сути является заменой используемой по умолчанию в PHP функции rand(), но работает гораздо быстрее и использует генератор случайных чисел с известными характеристиками.
Если вызывать функцию mt_rand() без необязательных аргументов min и max, то она вернет псевдослучайное целое значение в диапазоне от 0 до RAND_MAX (для OS Windows RAND_MAX равна 32768). Если же Вы хотите получить случайное число от 1 до 10 (включительно), то вызвать функцию нужно так:

mt_rand( 1 , 10 )

Ну а теперь перед вами сам скрипт, выводящий случайные изображения, с комментариями к командам:

<?php
   $dirPhotos = $_SERVER['DOCUMENT_ROOT'] . '/photos/'; // указываем директорию с файлами изображений или фотографий
   showRandomPhotos( $dirPhotos ); // вызываем главную функцию нашего проекта
    
   // главная функция
   function showRandomPhotos( $dirName ){
      $fileExt = array( 'png', 'jpg', 'jpeg' ); // перечисляем расширения файлов, которые мы разрешаем отображать
      if( empty( $dirName ) or !is_dir( $dirName )) die( 'Директория пуста или не соответствует формату!' );

      $files = scandir( $dirName ); // получаем список всех файлов и каталогов по указанному пути
      $photos = array(); // создаем массив, в который будут заноситься имена файлов изображений
		
      // в цикле перебираем все полученные значения директорий и файлов от функции scandir
      for( $i = 0; $i<sizeof( $files ); $i++ ){ 
         // исключаем из списка значения, которые не соответствуют имени файлов, полученных от функции scandir
         if( $files[$i] == '..' or $files[$i] == '.' ){
            continue;
         }			

         // получаем детальную информацию о файле
         $infoDetails = pathinfo( $files[$i] );
		
         // проверяем расширение файла, которые были разрешены нами в массиве $fileExt
         // и если расширение разрешено, то добавляем имя файла в массив $photos[]
         if( in_array( $infoDetails['extension'], $fileExt )){
            $photos[] = $files[$i];
         }
      }
		
      // выводим на страницу изображение, выбранное случайным образом из массива $photos[]
      echo '<img src="/photos/' . $photos[mt_rand( 0, (sizeof( $photos )-1 ))] . '">';
   }
?>

Используя таким образом вывод изображений на страницы сайта, можно собственно и не беспокоиться о том, сколько файлов с изображениями, фотографиями находится в директории и какие у них имена. Также можно не беспокоиться и о расширениях файлов, так как допустимые расширения мы указали в скрипте в массиве array( 'png', 'jpg', 'jpeg' ).

Возможно вам захочется контролировать предельное количество, размер, имена файлов, которые могут добавляться в массив, и тогда Вы можете расширить этот скрипт добавлением соответствующих команд для проверки. Скрипт же, показанный в этом уроке, всего лишь базовая конструкция для всеобщего изучения.

Удачного Вам оформления ваших сайтов и блогов с помощью скриптов PHP!

Метки: ,
Другие статьи похожей тематики:

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

10 комментариев к “Вывод случайных изображений скриптом PHP”

  1. artis72:

    цИТАТА … сколько файлов с изображениями, фотографиями находится в директории и какие у них имена …
    имхо ЭТО КАК РАЗ И МИНУС ДЛЯ seo

    • artis72, а в чем этот «минус для seo» заключается?
      Не всегда же абсолютно все каталоги с файлами изображений делают доступными для ПС, да и имена файлов могут быть действительно слишком разные, но SEO-пригодные, например такие, как «luchshiy-fail-izobrazheniy.jpg», «samaya-klassnaya-fotka.jpg» и так далее.

  2. Сергей:

    Хочу попробовать в своём шаблоне. Там картнки как-бы статические, но могут меняться со временем. И так будет лучше выглядеть.

  3. Андрей:

    Подскажите, как сделать чтобы скрипт также показывал картинки из подпапок?

    • Андрей,
      применительно к приведенному в этом посте примеру можно сделать так:

      1) добавить еще одну функцию для рекурсивного обхода каталогов:

      function getFiles( $dirName, &$files ){
      $fp = opendir( $dirName );
      while( $x_file = readdir( $fp )) {
      if( is_file( $dirName."/".$x_file )) {
      $files[] = $dirName."/".$x_file;
      } elseif( $x_file != "." && $x_file != ".." && is_dir( $dirName."/".$x_file )){
      getFiles( $dirName."/".$x_file, $files );
      }
      }
      closedir( $fp );
      }

      2) затем вместо строки №10 (из примера) вставляем код из двух строк:

      $files = array();
      getFiles( $dirName, $files );

  4. Андрей:

    Здравствуйте, Владимир!
    Подскажите, пожалуйста, что делаю не так?
    Может не там добавляю функцию?

    У меня получился этот код:

    <?php
    $dirPhotos = $_SERVER['DOCUMENT_ROOT'] . '/images/joomgallery/thumbnails/'; // указываем директорию с файлами изображений или фотографий
    showRandomPhotos( $dirPhotos ); // вызываем главную функцию нашего проекта

    // главная функция
    function showRandomPhotos( $dirName ){
    $fileExt = array( 'png', 'jpg', 'jpeg' ); // перечисляем расширения файлов, которые мы разрешаем отображать

    function getFiles( $dirName, &$files ){
    $fp = opendir( $dirName );
    while( $x_file = readdir( $fp )) {
    if( is_file( $dirName."/".$x_file )) {
    $files[] = $dirName."/".$x_file;
    } elseif( $x_file != "." && $x_file != ".." && is_dir( $dirName."/".$x_file )){
    getFiles( $dirName."/".$x_file, $files );
    }
    }
    closedir( $fp );
    }

    $files = array();
    getFiles( $dirName, $files ); // получаем список всех файлов и каталогов по указанному пути
    $photos = array(); // создаем массив, в который будут заноситься имена файлов изображений

    // в цикле перебираем все полученные значения директорий и файлов от функции scandir
    for( $i = 0; $i<sizeof( $files ); $i++ ){
    // исключаем из списка значения, которые не соответствуют имени файлов, полученных от функции scandir
    if( $files[$i] == '..' or $files[$i] == '.' ){
    continue;
    }

    // получаем детальную информацию о файле
    $infoDetails = pathinfo( $files[$i] );

    // проверяем расширение файла, которые были разрешены нами в массиве $fileExt
    // и если расширение разрешено, то добавляем имя файла в массив $photos[]
    if( in_array( $infoDetails['extension'], $fileExt )){
    $photos[] = $files[$i];
    }
    }

    // выводим на страницу изображение, выбранное случайным образом из массива $photos[]
    echo '’;
    }
    ?>

    Этот код по логике должен генерировать ссылки типа

    tanqu.es/images/joomgallery/thumbnails/alemania_1/leopard_2_13/leopard_2_5_20111210_1172587001.jpg (tanqu.es пробный сайт),

    а он генерирует ссылки как эта

    /images/joomgallery/thumbnails//home/carrosde/public_html/tanqu.es/images/joomgallery/thumbnails//alemania_1/leopard_2_13/leopard_2_5_20111210_1172587001.jpg

    Если в скрипте после thumbnails убрать / то и в ссылке он исчезает, а вот что делать с остальным не знаю.

    Что нужно паменять, чтобы генерировались нормальные ссылки?
    Заранее спасибо!!!

    • Андрей,
      это отчасти мое упущение… т.к. приведенная мной в пример функция рекурсивного обхода каталогов возвращает абсолютный путь к файлу на сервере, поэтому вам нужно строку

      $files[]=$dirName."/".$x_file;

      заменить тремя такими:

      $src=$dirName."/".$x_file;
      $start=$_SERVER['DOCUMENT_ROOT'].'/images/joomgallery/thumbnails/';
      $files[]=str_replace($start,"", $src);

      Таким образом в массив $files[] будут записываться относительные пути к файлам и подкаталогам относительно вашего ‘/images/joomgallery/thumbnails/’.

  5. Андрей:

    Ура, заработало!!!

    Спасибо вам огромное!

    Если хотите, могу разместить ссылки на ваш сайт. Траффика не даст, т. к. сайты на испанском, но PR должно поднять, только подскажите текст ссылки.

    • Андрей, я рад, что у Вас все получилось, и что код вам пригодился.
      Ну а если Вы предлагаете и не против разместить ссылки, то можно вот с таким текстом:
      «Programación web para principiantes» или «Web-programming for beginners».
      А сайт у Вас очень интересный, мне понравились там кучи фоток, и я даже себе взял несколько для обоев на рабочий стол.

  6. Андрей:

    Спасибо!

    Я разместил ссылки с текстом «Programación web para principiantes» на страницах http://www.bestfon.info и carrosdecombate.net, можете посмотреть!

Оставить комментарий

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

="4remind.ru

Rambler's Top100
Рейтинг@Mail.ru


Яндекс.Метрика