2012-06-28 5 views
4

Я должен показать некоторые баннеры на веб-странице. Количество баннеров будет с 10 (максимум 10). Я могу установить количество баннеров и каждую баннерную папку в базе данных. Изображения баннера хранятся в отдельных папках сервера в зависимости от категории. Баннеры отображаются в столбцах.Генерация случайных чисел без дубликатов

Мой код, Здесь long1, long2, ... long10 имена каталогов из базы данных

$array=array(); 
     for($n=1;$n<=$long;$n++) 
     { 
     $files = array(); 
     $dir=${'long'.$n}; 

       if(is_dir($dir)) 
       { 
       $openDir = opendir($dir); 
         while (false !== ($file = readdir($openDir))) 
         { 
           if ($file != "." && $file != "..") 
           { 
             $files[] = $file; 
           } 
         } 
       closedir($openDir); 
       } 


mt_srand((double) microtime()*1000000); 
$randnum = mt_rand(0,(sizeof($files)-1)); 

$arraycount=count($array); 
for($index=0;$index<=$arraycount;$index++) 
{ 
if(!in_array($array,$randnum)) 
    { 
     $array[]=$randnum; 
    } 

} 

$img = $dir."/".$files[$randnum]; 

    <input type="image" class="advt_image" src="<?=$img;?>" alt="" name=""/> 
} 

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

Я назначил массив для хранения каждого случайного числа. Нужно ли мне что-то менять в коде? любая мысль/идея?

Спасибо!

+0

В чем вопрос? –

+0

Я бы начал с массива всех возможных чисел и случайным образом извлекал числа в новый массив, пока у меня не было достаточно. Таким образом, вы никогда не повторяетесь. – TheZ

+1

не должно быть $ index <= $ arraycount, оно должно быть $ index <10 (или количество изображений, которое вы хотите выбрать) –

ответ

0

Вы можете удалить изображение, отображаемое из массива $ files в цикле. это означает, что вам нужно будет также проверить длину массива в цикле. вы можете использовать для этого array_diff.

$files = array(...); // this holds the files in the directory 
$banners = array(); // this will hold the files to display 
$count = 7; 
for($i=0;$i<$count;$i++) { 
    $c = mt_rand(0,count($files)); 
    $banners[] = $files[$c]; 
    $files = array_diff($files, array($files[$c])); 
} 

// now go ahead and display the $banners 
1
  1. размещаем идентификаторы вашего баннера в массиве. Каждый из них будет происходить один раз
  2. перетасовать этот массив с помощью Knuth shuffle
  3. выделяют первые 10 в HTML выход
0

Простой способ решить эту проблему было бы создать массив для хранения списка баннера, чем раньше показывая их.

Я не читал ваш код (извините), но вот базовая концепция, с которой это возможно.

$bannerList = array(); 

//Now, check if the list contains the banner before adding it 
while($rows) { //your big list of banners 

    if(!in_array($rows['bannerpath'])) { 
     $bannerList[] = $rows['bannerpath']; 
    } 

}