Intereting Posts
как ограничить определенный домен (ы) электронной почты, а также отправить форму Почему Iframe не работает для yahoo.com параметр, уже выбранный при загрузке страницы в выпадающем списке, а также changeble Сравнение разных строк в PHP с == возвращает true Отобразить способы доставки для интерфейса, как в панели администратора? Является ли ввод шестнадцатеричных данных достаточным для дезинфекции SQL-запросов? Woocommerce content-single-product template override не работает Отображение сообщений в трех столбцах с использованием php mysqli: mysqli_result не может быть преобразован в строку Laravel redirect :: route показывает сообщение между загрузками страницы PDO, MySQL – Как вернуть массив из функции? Медленные ответы с использованием API-интерфейса Asana Как получить только IP-адрес / подсеть Проверьте Gmail IMAP через PHP для новых сообщений в цикле Как усечь HTML на определенное количество символов?

Загрузка случайных изображений из каталога

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

<?php $a = array(); $dir = '../public/wp-content/uploads/2012/01'; if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if (preg_match("/\.png$/", $file)) $a[] = $file; elseif (preg_match("/\.jpg$/", $file)) $a[] = $file; elseif (preg_match("/\.jpeg$/", $file)) $a[] = $file; } closedir($handle); } foreach ($a as $i) { echo "<img src='" . $dir . '/' . $i . "' />"; } ?> 

Проблема в том, что он загружает сразу 400 000 изображений. Мне нужно только загрузить 30. 30 случайных изображений из каталога. Я попытался найти какой-то код, например, изменить выше:

 <?php $a = array(); $dir = '../public/wp-content/uploads/2012/01'; if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if (preg_match("/\.png$/", $file)) $a[] = $file; elseif (preg_match("/\.jpg$/", $file)) $a[] = $file; elseif (preg_match("/\.jpeg$/", $file)) $a[] = $file; } closedir($handle); } foreach ($a as $i) { echo "<img src='" . $dir . '/' . $i . "' />"; if (++$i == 2) break; } ?> 

Но, похоже, это ничего не делает. Поэтому, если кто-то может помочь мне получить 30 случайных фотографий из этого каталога для загрузки и иметь некоторую кнопку перезагрузки, это будет очень полезно.

заранее спасибо

Вот мое решение с кешем:

 <?php define('CACHE_FILE', 'mycache.tmp'); define('CACHE_TIME', 20); // 20 seconds (for testing!) define('IMG_COUNT', 30); define('IMG_DIR', '../public/wp-content/uploads/2012/01'); /** * Loads the list (an array) from the cache * Returns FALSE if the file couldn't be opened or the cache was expired, otherwise the list (as an array) will be returned. */ function LoadListFromCache($cacheFile, $cacheTime) { if ( file_exists($cacheFile) ) { $fileHandle = fopen($cacheFile, 'r'); if ( !$fileHandle ) return false; // Read timestamp (separated by "\n" from the content) $timestamp = intval( fgets($fileHandle) ); fclose($fileHandle); // Expired? if ( $timestamp+$cacheTime > time() ) return false; else { // Unserialize the content! $content = file_get_contents($cacheFile); $content = substr( $content, strpos($content, "\n") ); $list = unserialize($content); return $list; } } return false; } /** * Caches the passed array * Returns FALSE if the file couldn't be opened, otherwise TRUE. */ function SaveListToCache($cacheFile, $list) { $fileHandle = fopen($cacheFile, 'w'); if ( $fileHandle === FALSE ) return false; fwrite($fileHandle, time()); fwrite($fileHandle, "\n"); fwrite($fileHandle, serialize($list)); fclose($fileHandle); return true; } /** * Generates the list of all image files (png, jpg, jpeg) and caches it. * Returns the list as an array. */ function GenerateList() { $a = array(); $dir = IMG_DIR; if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if (preg_match("/\.png$/", $file)) $a[] = $file; elseif (preg_match("/\.jpg$/", $file)) $a[] = $file; elseif (preg_match("/\.jpeg$/", $file)) $a[] = $file; } closedir($handle); } SaveListToCache(CACHE_FILE, $a); return $a; } function GetRandomImages($list, $count) { $listCount = count($list); $randomEntries = array(); for ($i=0; $i<$count; $i++) { $randomEntries[] = $list[ rand(0, $listCount) ]; } return $randomEntries; } // This code will execute the other functions! $list = LoadListFromCache(CACHE_FILE, CACHE_TIME); if ( $list === FALSE ) { $list = GenerateList(); } $images = GetRandomImages($list, IMG_COUNT); foreach ($images as $image) { echo '<img src="', IMG_DIR.DIRECTORY_SEPARATOR.$image, '" />'; } 

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

Если вы хотите использовать свой существующий код, подумайте об этом так. У вас есть массив длиной n содержащий имена изображений. Вы хотите создать тридцать случайных чисел от 0 до n-1 . Затем отобразите изображение, связанное с этой позицией в массиве. Я не эксперт по php, но вот какой-то псевдокод:

 $a = array(); $dir = '../public/wp-content/uploads/2012/01'; if (preg_match("/\.png$/", $file)) $a[] = $file; elseif (preg_match("/\.jpg$/", $file)) $a[] = $file; elseif (preg_match("/\.jpeg$/", $file)) $a[] = $file; for ( i=0; i < 30; i++) { //generate a random number between 0 and N-1 random = rand(0, $a.length - 1); //display that image in the array echo "<img src='" . $dir . '/' . $a[random] . "' />"; } 

Вам нужно создать новую переменную для счетчика вместо использования $i

Например, вы можете сделать это вместо этого

 $j = 0; foreach ($a as $i) { echo "<img src='" . $dir . '/' . $i . "' />"; $j++; if ($j >= 30) { break; } } 

EDIT : Возможно, для случайной части вы можете сначала создать случайное число между 0 и n-1, где n – общее количество изображений, а затем просто вывести изображение из массива с номером индекса.

Вместо использования foreach , я думаю, вам понадобится цикл for .

 $totalImgs = count($a); $imgUsed = array(); for ($j = 0; $j < 30; $j++) { do { $randIndex = mt_rand(0, $totalImgs); } while ($imgUsed[$randIndex] === TRUE); $imgUsed[$randIndex] = TRUE; echo "<img src='" . $dir . '/' . $a[$randIndex] . "' />"; } 

Возможно, вам стоит прочитать только 30 файлов из вашего каталога. Остановите поиск в каталоге, когда readdir вернет false или длина вашего массива равна 30.

Это должно работать

  $a = array(); $dir = '../public/wp-content/uploads/2012/01'; if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle)) && (count($a) <= 30) { if (preg_match("/\.png$/", $file)) $a[] = $file; elseif (preg_match("/\.jpg$/", $file)) $a[] = $file; elseif (preg_match("/\.jpeg$/", $file)) $a[] = $file; } closedir($handle); } 

Он может не выполняться (я не пытался). Но идея здесь

Для рандомизации изображения: shuffle ($ a) должен сделать трюк

простейшим способом, вы можете использовать

 find , sort , head 

команды в linux, в сочетании с встроенным PHP

 exec() 

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

 <?php $picdir = "directory/containing/pictures"; // directory containing only pictures exec("find " . $picdir . " | sort -R | head -30 ",$links); while(list($index,$val) = each($links) ) { echo "<img src =" .$val . "> <br/>"; // shows image } 

?> Здесь $ link array содержит случайные 30 имен изображений (из папки) с полным путем. Это используется с тегом img в эхо для генерации изображений

Здесь $ picdir имеет путь к каталогу, имеющему изображения, и предполагается, что в dirrectory есть только файлы изображений. в другом случае его единственным вопросом изменения команды find для исключения файлов без изображения (например, с помощью команды grep для исключения)