Генерация случайных чисел без дубликатов

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

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

Спасибо!


person Zendie    schedule 28.06.2012    source источник
comment
Я бы начал с массива всех возможных чисел и случайным образом извлекал числа в новый массив, пока мне не хватило бы. Так вы никогда не повторитесь.   -  person TheZ    schedule 28.06.2012
comment
это не должно быть $index‹=$arraycount, это должно быть $index‹10 (или количество изображений, которые вы хотите выбрать)   -  person Kinjal Dixit    schedule 28.06.2012


Ответы (3)


Вы можете удалить отображаемое изображение из массива $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
person Kinjal Dixit    schedule 28.06.2012

  1. поместите идентификаторы ваших баннеров в массив. Каждое произойдет один раз
  2. перетасуйте этот массив, используя перетасовку Кнута
  3. выдать первые 10 в выводе HTML
person Will    schedule 28.06.2012

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

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

$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'];
    }

}
person Starx    schedule 28.06.2012