2010-05-01 3 views
4

J'ai des bannières publicitaires avec nombre de vues, comme le système CPM. Et par exemple:bannière rotator publicité avec probabilité

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 

et sur mon site la bannière doit apparaître dans cette position (lorsque la page est reloaded):

banner1 banner2 banner1 banner2 banner3

si le nombre de vues est plus élevé que la probabilité d'apparition est plus élevé

comment puis-je faire cela en php?

Répondre

2

Tout d'abord, votre système est juste ... stupide. Il perpétue avec beaucoup de bannières vues tout récemment créé des bannières avec 0 ou quelques vues ne sera jamais une chance d'être choisi et donc ne sera jamais réellement vu ...

Cela étant dit, si vous avez un tableau ressemble à ceci:

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

Vous pouvez utiliser une fonction comme celle-ci weightily choisir une bannière:

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

Utilisation (tester @ CodePad.org ou @ IDEOne):

echo Probability($banners); // banner5 

échantillon de 100 exécutions:

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

Voici une manière de php pour le faire

J'imagine votre tableau ressemblera à quelque chose comme ça ...

$banners = array(

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

Cette fonction boucles essentiellement à travers les bannières et cependant beaucoup vues une bannière a , que de nombreux éléments de son index de tableau sont ajoutés à un tableau. Puis un aléatoire est choisi. Les articles avec plus de vues ont une meilleure chance d'être choisis.

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

Une option simple MySQL est:

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

bannières avec plus de vues auront une plus grande chance d'être le meilleur résultat

+0

-1, cette requête SQL renvoie toujours la bannière avec le plus vues. –

+0

En fait, il ne va pas. – Galen

+0

Vous avez raison désolé, a changé mon vote. –