2012-02-11 2 views
0

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

Существует несколько сценариев, которые могут искать отдельные каталоги (не подпапки) и другие скрипты, которые могут искать подпапки, но возвращать только один файл.

Чтобы добавить небольшой контекст в ситуацию, возвращаемые файлы будут включены как li во вращающийся баннер.

Заранее благодарим за любую помощь, надеюсь, это возможно.

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

<?php function RandomFile($folder='', $extensions='.*'){ 
    // fix path: 
    $folder = trim($folder); 
    $folder = ($folder == '') ? './' : $folder; 

    // check folder: 
    if (!is_dir($folder)){ die('invalid folder given!'); } 

    // create files array 
    $files = array(); 

    // open directory 
    if ($dir = @opendir($folder)){ 

     // go trough all files: 
     while($file = readdir($dir)){ 

      if (!preg_match('/^\.+$/', $file) and 
       preg_match('/\.('.$extensions.')$/', $file)){ 

       // feed the array: 
       $files[] = $file;     
      }    
     }   
     // close directory 
     closedir($dir);  
    } 
    else { 
     die('Could not open the folder "'.$folder.'"'); 
    } 

    if (count($files) == 0){ 
     die('No files where found :-('); 
    } 

    // seed random function: 
    mt_srand((double)microtime()*1000000); 

    // get an random index: 
    $rand = mt_rand(0, count($files)-1); 

    // check again: 
    if (!isset($files[$rand])){ 
     die('Array index was not found! very strange!'); 
    } 

    // return the random file: 
    return $folder . "/" . $files[$rand]; 

} 


$random1 = RandomFile('project-banners/website-design'); 
while (!$random2 || $random2 == $random1) { 
    $random2 = RandomFile('project-banners/logo-design'); 
} 
while (!$random3 || $random3 == $random1 || $random3 == $random2) { 
    $random3 = RandomFile('project-banners/design-for-print'); 
} 
?> 

И вторя результаты в контейнер (в данном случае): ул

<?php include($random1) ;?> 
<?php include($random2) ;?> 
<?php include($random3) ;?> 

Благодаря quickshiftin за его помощь, однако это было немного выше моего уровня мастерства.

Для получения информации оригинальный сценарий, который я изменил найти по адресу:

http://randaclay.com/tips-tools/multiple-random-image-php-script/

ответ

0

Scrubbing в файловой системе каждый раз случайным образом выбрать файл для отображения будет очень медленным. Вы должны заранее индексировать структуру каталогов. Вы можете сделать это по-разному, попробуйте простой find command, или если вы действительно хотите использовать PHP, моим любимым выбором будет RecursiveDirectoryIterator плюс RecursiveIteratorIterator.

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

EDIT:

Добавление простого реального примера:

// define the location of the portfolio directory 
define('PORTFOLIO_ROOT', '/Users/quickshiftin/junk-php'); 
// and a place where we'll store the index 
define('FILE_INDEX', '/tmp/porfolio-map.txt'); 

// if the index doesn't exist, build it 
// (this doesn't take into account changes to the portfolio files) 
if(!file_exists(FILE_INDEX)) 
    shell_exec('find ' . PORTFOLIO_ROOT . ' > ' . FILE_INDEX); 

// read the index into memory (very slow but easy way to do this) 
$aIndex = file(FILE_INDEX); 

// randomly select an index 
$iIndex = rand(0, count($aIndex) - 1); 

// spit out the filename 
var_dump(trim($aIndex[$iIndex])); 
+0

Благодаря Quickshiftin, извините Я должен был упомянуть, что у меня нет навыков PHP. Есть ли какие-нибудь рабочие примеры, на которые вы могли бы обратить меня? Постскриптум - Случайные файлы - это ссылки на дизайнерские проекты в моем портфолио, а не рекламодатели :-) – sixtillnine

+0

Я бросил там код, с комментариями, надеюсь, что это поможет. – quickshiftin

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