|
|
|
| Приветствую. Поставил себе задачу сделать ротатор картинок, который не покажет за один день одному и тому же пользователю одну и ту же картинку дважды. Может быть когда-нибудь мутирую его в ротатор баннеров.
Возник вопрос реализации выбора рандомной картинки. Делаю так:
function show_banner($dir, & $files)
{
$attempts = 0;
for($i=0; $i<count($files); $i++)
{
if($files[$i]["shown"] == 1)
$attempts++;
}
if($attempts == count($files))
echo "Вы посмотрели все баннеры";
else
{
$id = rand(0, count($files)-1);
if($files[$id]["shown"] != 1)
{
echo "<img src=".$dir.$files[$id]["name"]."><br>".$files[$id]["name"]."<br>";
$files[$id]["shown"] = 1;
return true;
}
else
show_banner($dir, $files);
}
return false;
}
|
То есть при каждой загрузке страницы с баннером скрипт проходит по всему массиву названий картинок и смотрит, какие уже показывал. Если показал все, бездельничает, если нет, начинает рандомить случайные номера в этом массиве, пока не найдет не показанную картинку. Если картинок относительно немного, это не будет тормозить, а будет ли это тормозить, если картинок и запросов много? В общем, какие можете дать советы? | |
|
|
|
|
|
|
|
для: Skima
(27.11.2008 в 10:36)
| | $files у Вас в сессии живет чтоли?
1 вариант . Убрать рандом. Ибо не нужен.
2. В первом цикле собирать индексы непоказанных картинок в массив. И извлекать произвольный элемент уже из этого массива. | |
|
|
|
|
|
|
|
для: Trianon
(27.11.2008 в 11:22)
| | $files обитает в сессии.
1. Хмм... а как тогда показывать случайную картинку из доступных? Если простым проходом цикла это выполнять, то первый баннер в списке будет показываться каждый день, а до 1024го врядли пользователь докликается.
Кстати, пока писал, подумал о перемешивании массива имён картинок до прохода цикла. Это имелось в виду? Тогда да, тогда всё честно )
2. В первом собираем непоказанные, перемешиваем, показываем циклом. Ага, понял. Спасибо.
Есть ещё какие-нибудь улучшения? ) Я жаден до них... | |
|
|
|