Я хотел бы случайно загружать изображения из каталога и иметь кнопку где-нибудь, которая обновляет всю страницу. Вот текущий код, который у меня есть сейчас:
<?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 для исключения)