Приветствую Вас, уважаемые читатели и посетители блога 4remind.ru. Предлагаю вашему вниманию небольшой скрипт на PHP, который позволит выводить на страницы сайта любое изображение или фотографию в случайном порядке или, скажем другими словами, реализовать простое слайд-шоу.
Для простоты реализации поставленной задачи изображения должны располагаться в одной директории. Файлы изображений или фотографий могут иметь любые имена и любое расширение, соответствующее графическому представлению файла, например JPG, PNG, GIF и другие.
В предлагаемом ниже скрипте кроме часто употребляемых функций, нами еще будут использованы стандартные функции языка PHP, которые предназначены для работы с файловой системой и с которыми стоит для начала ознакомиться или кому-то просто вспомнить о них:
scandir( $dirName );
Эта функция позволяет получить список всех файлов и каталогов, которые расположены по пути, указанному в параметре $dirName.
Она возвращает массив, в котором содержатся имена файлов и каталогов, расположенных по пути, переданном в параметре $dirName. Если путь в параметре $dirName указан неверно, то функция вернет логическое FALSE и вдобавок сгенерирует сообщение об ошибке уровня E_WARNING (предупреждающее сообщение).
$array = pathinfo( $path );
Данная функция возвращает детальную информацию о пути к файлу, указанному в параметре $path, а конкретнее она возвращает ассоциативный массив, в котором содержится информация о пути $path.
В составе возвращаемого массива содержатся элементы: dirname, basename и extension, значения которых можно получить как показано здесь:
"; echo $pathDetails['basename'] . ""; echo $pathDetails['extension'] . ""; ?>
Например, если в параметре $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 )
Ну а теперь перед вами сам скрипт, выводящий случайные изображения, с комментариями к командам:
'; } ?>
Используя таким образом вывод изображений на страницы сайта, можно собственно и не беспокоиться о том, сколько файлов с изображениями, фотографиями находится в директории и какие у них имена. Также можно не беспокоиться и о расширениях файлов, так как допустимые расширения мы указали в скрипте в массиве array( 'png', 'jpg', 'jpeg' ).
Возможно вам захочется контролировать предельное количество, размер, имена файлов, которые могут добавляться в массив, и тогда Вы можете расширить этот скрипт добавлением соответствующих команд для проверки. Скрипт же, показанный в этом уроке, всего лишь базовая конструкция для всеобщего изучения.
Удачного Вам оформления ваших сайтов и блогов с помощью скриптов PHP!
Метки: PHP, изображения
цИТАТА … сколько файлов с изображениями, фотографиями находится в директории и какие у них имена …
имхо ЭТО КАК РАЗ И МИНУС ДЛЯ seo
artis72, а в чем этот «минус для seo» заключается?
Не всегда же абсолютно все каталоги с файлами изображений делают доступными для ПС, да и имена файлов могут быть действительно слишком разные, но SEO-пригодные, например такие, как «luchshiy-fail-izobrazheniy.jpg», «samaya-klassnaya-fotka.jpg» и так далее.
Хочу попробовать в своём шаблоне. Там картнки как-бы статические, но могут меняться со временем. И так будет лучше выглядеть.
Подскажите, как сделать чтобы скрипт также показывал картинки из подпапок?
Андрей,
применительно к приведенному в этом посте примеру можно сделать так:
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 );
Здравствуйте, Владимир!
Подскажите, пожалуйста, что делаю не так?
Может не там добавляю функцию?
У меня получился этот код:
$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
// исключаем из списка значения, которые не соответствуют имени файлов, полученных от функции scandir
for( $i = 0; $i
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/’.
Ура, заработало!!!
Спасибо вам огромное!
Если хотите, могу разместить ссылки на ваш сайт. Траффика не даст, т. к. сайты на испанском, но PR должно поднять, только подскажите текст ссылки.
Андрей, я рад, что у Вас все получилось, и что код вам пригодился.
Ну а если Вы предлагаете и не против разместить ссылки, то можно вот с таким текстом:
«Programación web para principiantes» или «Web-programming for beginners».
А сайт у Вас очень интересный, мне понравились там кучи фоток, и я даже себе взял несколько для обоев на рабочий стол.
Спасибо!
Я разместил ссылки с текстом «Programación web para principiantes» на страницах http://www.bestfon.info и carrosdecombate.net, можете посмотреть!