помогите с массивом

Vadimka

Новичок
помогите с массивом

prior - приоритет банера
id - id баннера

здесь я выбираю случайный id банера из массива, а как выбрать баннер с наибольшим значением prior ?

$result=mysql_query($query); echo mysql_error();
while($Column=mysql_fetch_array($result)){
$Priority=$Column['prior'];
for($i=1; $i<=$Priority; $i++){
$banners[]=$Column['id'];
}
}
$index = rand(0, count($banners));
$new_ban=$banners[$index];

-~{}~ 15.08.05 22:10:

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

Demiurg

Guest
для этого надо выучить язык sql и желательно знаеть его диалект mysql. что у тебя в $query ?
 

Vadimka

Новичок
в $query достаточно много информации, выбор банера по условиям (формат, тип, кол-во показов, профайл и т.п.)

$query="SELECT bs.prior, bb.prior, bb.id, bb.id_site, bb.format_b2, bb.typ_b, bb.alt, bb.profile, bs.procent, bs2.url_site, bs2.procent
FROM bn_banners bb, bn_site bs , bn_site bs2
LEFT JOIN bn_prof bp ON bb.id=bp.idban AND bb.profile=bp.idprof
LEFT JOIN bn_site3 bs3 ON bs3.idkto='$id_site'
WHERE $balance > '0'
AND bb.action='0'
AND bb.action_site='0'
AND bb.format_seti='$format_seti'
AND bb.id_site!='$id_site'
AND bb.id_site=bs.id
AND (bb.user_limit='0' || (bb.user_limit > (select count(*) from bn_views_seg WHERE bnrs=bb.id AND ip='$ip2') ) )
AND (bb.day_limit='0' || (bb.day_limit > bb.view_seg ) )
AND (bb.profile='0' || (bb.profile=bp.idprof AND (bp.format_seti='$format_seti' AND bp.idkogo=bs2.id AND bp.idkto=bb.id_site AND (bb.profile_show_site='1') ) ) )
AND bs2.id='$id_site'
AND (bb.format_b2=bs2.fb2 OR bb.format_b2=bs2.fb3 OR bb.format_b2=1)
AND (bs2.$b_s='0' || ((bs2.$b_s='1' AND bs3.format_seti='$format_seti' AND bs3.idkto='$id_site' && bs3.idkogo=bb.id_site) OR (bs2.$b_s='2' AND bs3.format_seti='$format_seti' AND bs3.idkto='$id_site' && bs3.idkogo!=bb.id_site) ) )
AND ($id_site='1' OR bs2.url_site REGEXP '$host')
ORDER BY 1 DESC
";
 

BuTbKa

Новичок
В запросе надо ORDER BY `bb.prior` DESC
первый элемент результата будет содержать данные о банере с максимальным приоритетом, короче получишь массив в котором первый элемент с наиб приоритетом, а последний с наименьшим
 

Vadimka

Новичок
спасибо за ответы, но думаю что выбор баннеров по приоритету немного не правилен, вернее есть идея, создать массив приоритетов, например, если у банера 1 приоритет =3, а у 2 =1 и 3=1 то как создать массив типа:
$banner = array(1,1,1,2,3);
следовательно в таком массиве у 1 баннера случайная возможность выбора в 3 раз больше чем у остальных...
подскажите как это реализовать?
 

antson

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

Вспомогательный массив можно построить по другому
$show=array();
$summaPrior=0;
в цикле по результатам запроса из базы банеров
$summaPrior+=$row->prior;
$show[0][] = $row->ban_id
$show[1][] = $summaPrior;
конец цикла

генерируем случайное число $x от 0 до $summaPrior
в цикле пробегаемся по массиву
если $show[1][$i]>$x то нужный банер $show[0][$i-1]

если в цикле нужный банер не найден, то он был последним в массиве.

-~{}~ 17.08.05 08:26:

Статистика генерирование случайной величины с законом распределения заданного гистограммой вероятностей
 

tashkentchi

Новичок
Выбор случайного банера в первую очередь с наибольшим приоритетом:
1. Создаем в таблице поле Prior со значениями в диапазоне 1..100
2. Генерируем случайное число $x от 0 до 99
3. SELECT ... FROM ... WHERE ... AND Prior > $x ORDER BY RAND() LIMIT 1
 

Vadimka

Новичок
Автор оригинала: antson
Vadimka
плохая идея создавать массив с номерами банеров повторенных приоретет раз. Число элементов массива будет большим.

Вспомогательный массив можно построить по другому
$show=array();
$summaPrior=0;
в цикле по результатам запроса из базы банеров
$summaPrior+=$row->prior;
$show[0][] = $row->ban_id
$show[1][] = $summaPrior;
конец цикла

генерируем случайное число $x от 0 до $summaPrior
в цикле пробегаемся по массиву
если $show[1][$i]>$x то нужный банер $show[0][$i-1]

если в цикле нужный банер не найден, то он был последним в массиве.

-~{}~ 17.08.05 08:26:

Статистика генерирование случайной величины с законом распределения заданного гистограммой вероятностей
правильнее даже приоритет давать не банеру а сайту банера, по дефолту у сайтов приоритет 0, а у комерческих от 1 до 10, так что не так и много будет сайтов (приоритетов)...

- ну ты ведь тоже создаешь массив, в чем разница?

-~{}~ 17.08.05 19:03:

Автор оригинала: tashkentchi
Выбор случайного банера в первую очередь с наибольшим приоритетом:
1. Создаем в таблице поле Prior со значениями в диапазоне 1..100
2. Генерируем случайное число $x от 0 до 99
3. SELECT ... FROM ... WHERE ... AND Prior > $x ORDER BY RAND() LIMIT 1
а где равномерность показов?
из 5 показов должно быть:
1 -3 показа, 2 -1 показ, 3 - 1 показ
 

tashkentchi

Новичок
а где равномерность показов?
из 5 показов должно быть:
1 -3 показа, 2 -1 показ, 3 - 1 показ
Если нужна равномерность, то можешь сделать так:
1. Создаем в таблице поле showing, в котором храним число, - сколько раз этот баннер должен быть показан.
2. Генерируем случайное число $x от 0 до max(showing)-1
3. SELECT ... , id FROM ... WHERE ... AND showing > $x ORDER BY RAND() LIMIT 1
4. UPDATE ... SET showing = showing - 1 WHERE id = $id

-~{}~ 18.08.05 13:15:

baev
У твоего алгоритма маленький недостаток:
В начале цикла у всех баннеров вероятность показа одинакова независимо от веса.
 

Vadimka

Новичок
вот решил вернуться к написанию кода...
есть вопрос что лучше применить, что будет правильнее, что меньше будет грузить сервер?

- задача выбор сайта с большим приоритетом в первую очередь...
1. в запросе проверить наличие приоритета сайта + выполнить деление кол-ва показов на приоритет показа и затем выбрать случайный банер
AND ( (bs.prior>'1' AND bs.view_ban1_seg2/bs.prior <= bs.1prior_k) || bs.prior='1')
... ORDER BY RAND() LIMIT 1
2. или без этого условия но загнать все строки в массив с номерами банеров повторенных приоретет раз

что правильнее будет?
у кого какие соображения?
 
Сверху