olasılık ile banner rotator reklam

2 Cevap php

I have banners advertising with number of views, like CPM system. And for example :

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

(sayfa yeniden yüklendiğinde) ve web siteme banner bu konumda görünmesini gerekir:

banner1 banner2 banner1 banner2 banner3

görüşlerin sayısı yüksek ise o hayaletin olasılığı yüksektir

ben bu php nasıl yapabilirim?

2 Cevap

Her şeyden önce, sistem sadece budur ... stupid. Yeni böylece 0 veya birkaç views çekilmesi için bir şans asla afiş oluşturulur ve süre will never be actually seen ... O manzaralı dolu pankartlar sürdürmektedir

Bu gibi görünen bir dizi varsa, söyleniyor:

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

Sen weightily bir afiş almak için bu gibi bir işlevi kullanabilirsiniz:

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;
}

Usage (test it @ CodePad.org veya @ IDEOne):

echo Probability($banners); // banner5

Sample from 100 executions:

Array
(
    [banner5] => 41
    [banner4] => 38
    [banner3] => 10
    [banner2] => 8
    [banner1] => 3
)

İşte bunu yapmak için bir php yolu

Ben diziyi hayal ediyorum böyle bir şey olacak ...

$banners = array(

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

Bu işlev temelde afişler aracılığıyla döngüsü ve ancak birçok görünümleri afiş, dizi indeksi birçok öğe bir diziye eklenir olduğunu. Sonra rasgele bir seçilir. Daha manzaralı ürün seçilmiş olmanın daha iyi bir şans var.

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);

Basit bir mysql seçenek:

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

Daha manzaralı afiş en iyi sonuç olma şansı daha yüksek olacak