баннерная ротаторная реклама с вероятностью - PullRequest
4 голосов
/ 02 мая 2010

У меня есть баннеры с количеством просмотров, например система CPM. И например:

i have 3 banner:
banner1 with 20.000 nr of views
banner2 with 10.000 nr of views
banner3 with 5.000 nr of views

и на моем сайте баннер должен появляться в этой позиции (при перезагрузке страницы):

banner1 banner2 banner1 banner2 banner3

если количество просмотров выше, то вероятность появления выше

как я могу сделать это в php?

Ответы [ 2 ]

2 голосов
/ 02 мая 2010

Прежде всего, ваша система просто ... тупая . Он увековечивает баннеры с большим количеством просмотров, в то время как вновь созданные баннеры с 0 или несколькими просмотрами никогда не получат шанс быть выбранным, и, таким образом, никогда не будет фактически видно ...

При этом, если у вас есть массив, который выглядит следующим образом:

$banners = array
(
    'banner1' => 1,
    'banner2' => 2,
    'banner3' => 4,
    'banner4' => 8,
    'banner5' => 16,
);

Вы можете использовать такую ​​функцию, чтобы взвешенно выбрать один баннер:

function Probability($data)
{
    if (is_array($data) === true) {
        $result = 0;
        $probability = mt_rand(1, array_sum($data));

        foreach ($data as $key => $value) {
            $result += $value;

            if ($result >= $probability) {
                return $key;
            }
        }
    }

    return false;
}

Использование (проверить @ CodePad.org или @ IDEOne ):

echo Probability($banners); // banner5

Образец из 100 казней:

Array
(
    [banner5] => 41
    [banner4] => 38
    [banner3] => 10
    [banner2] => 8
    [banner1] => 3
)
2 голосов
/ 02 мая 2010

Вот php способ сделать это

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

$banners = array(

    array (
        'name' => 'banner1',
        'views' => 20
    ),
    array (
        'name' => 'banner2',
        'views' => 10
    ),
    array (
        'name' => 'banner3',
        'views' => 5
    )
);

Эта функция в основном перебирает баннеры, и как бы ни было много просмотров баннера, многие элементы его индекса массива добавляются в массив. Затем выбирается случайный. Предметы с большим количеством просмотров имеют больше шансов быть выбранными.

function getWeightedRandom( $array ) {

    $universe_array = array();

    foreach ( $array as $k => $b ) {
        $universe += $b['views'];
        $universe_array = array_pad( $universe_array, $universe, $k );
}

    $rand = mt_rand( 0, count( $universe_array ) -1 );
    return $array[ $universe_array[ $rand ] ];

}


$r = getWeightedRandom($banners);
print_r($r);

Простой параметр mysql:

select * from banners order by rand() * views desc limit 1

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

...