2012-01-12 4 views
1

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

<?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 случайных фотографий из этого каталога, чтобы загрузить и иметь некоторый тип перезагрузите кнопку, что было бы очень полезно.

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

+0

'$ i' является строкой, по-видимому поэтому '++ $ i' не имеет смысла. Последующее сравнение равенства также не сработало бы. – mrtsherman

ответ

1

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

<?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, '" />'; 
} 
+0

Это не показывает мое случайное эхо «»; в любом месте! –

+0

@JDAudi Обновлено! – ComFreek

+0

Я получаю это: fopen требует два параметра 1, данный по строке –

1

Вы должны возможно только для чтения 30 файлов из каталога. Прекратите смотреть в каталоге, когда READDIR возвращают ложные или длина вашего массива 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 ($ а) следует сделать трюк

+0

Не могли бы вы дать мне пример кода? Все это было копирование и вставка и изменение путей, чтобы заставить его работать. Я действительно не понимаю команды readdir. –

+0

Извините, я не делал php с тех пор, поэтому я, возможно, немного ржавый. Команда readdir возвращает следующий файл из каталога, который вы открываете, пока не достигнете конца, поэтому здесь вы останавливаетесь только при чтении всего содержимого в каталоге. Через минуту я редактирую свой вопрос. –

+0

Хорошо, спасибо, я ценю это, я понимаю сейчас! –

1

Вам нужно создать новую переменную для счетчика вместо использования $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] . "' />"; 
} 
+0

Это работает! теперь как о рандомизации изображений при загрузке страницы или кнопке –

+0

Просто поставьте это перед 'foreach (...)': 'shuffle ($ a);'. – ComFreek

+0

@ComFreek - не будет перетасовывать элементы массива 400k без лишних затрат? – mrtsherman

1

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

Если вы хотите использовать существующий код, подумайте об этом так. У вас есть массив длиной n, содержащий имена изображений. Вы хотите generate thirty random numbers между 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] . "' />"; 
} 
1

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

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 
} 

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

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

Смежные вопросы