02
FEB09[PHP] Bannerrotationssystem
Ich möchte euch gerne mein selbst entwickeltes Bannerrotationssystem einmal vorstellen. Folgende Situation war gegeben:
BannerA: soll mit 20% eingeblendet werden
BannerB: soll mit 50% eingeblendet werden
BannerC: soll die restlichen 30% der Einblendungen bekommen
Ein einfaches:
1 |
… ORDER BY RAND() LIMIT 1
|
hilft uns da nicht sonderlich weiter. SQL würde zwar eine Art Rotation hinbekommen, liefert aber trotzdem fast jeden Banner dann zu 33.33% aus und das wollen wir ja nicht. Also musste ich ein Algorithmus entwickeln der das ganze anhand einer Wertigkeit zurückgibt.
Die Theorie
Gehen wir mal davon aus, wir hätten einen Gesamtcounter von 1200, die Verteilung wäre wie folgt:
BannerA: 1200*0.2=240
BannerB: 1200*0.5=600
BannerC: 1200*0.3=360
Bei unserem nächsten Aufruf hätten wir den Gesamtwert von 1201, nur welcher der drei Banner würde jetzt angezeigt werden? BannerB wäre die richtige Antwort ^^ Über folgenden Rechnung komm ich auf das Ergebnis:
( ( 100% / Gesamtwert ) * aktuellerAnzeigewertA ) – WertigkeitA
( ( 100% / Gesamtwert ) * aktuellerAnzeigewertB ) – WertigkeitB
( ( 100% / Gesamtwert ) * aktuellerAnzeigewertC ) – WertigkeitC
Das ergibt:
BannerA: -0,016652789342214820982514571190674
BannerB: -0,041631973355537052456286427976686
BannerC: -0,024979184013322231473771856786012
Aus diesen drei Werten nehmen wir jetzt den kleinsten Wert und lassen diesen anzeigen. Wiederholen wir den ganzen Vorgang mit BannerB = 601 Anzeigen und einem nächsten Gesamt von 1202, bekommen wir folgende Werte:
BannerA: -0,033277870216306156405990016638935
BannerB: 0
BannerC: -0,049916805324459234608985024958403
Unser nächster Banner wäre also BannerC. Das könnten wir jetzt immer so weiter machen aber da ich das ganze System in der Praxis schon getestet habe, bleibt euch keine andere Wahl als mir zu vertrauen *hrhr ich möchte euch zum Schluss noch den ganzen Algorithmus als PHP -Code zeigen.
Die Praxis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function getBanner( $n_counter, &amp;$a_banner ) { // smallest difference $n_miniDifference = 0; // key from the next banner $n_anbieter = 0; // increase the countervalue ++$n_counter; // count all banner foreach( $a_banner as $n_indexKey => $o_bannerValues ) { // ( ( 100% / [next Countervalue] ) * [Bannerviews] ) - [Bannervalue] $n_difference = ( ( 100 / $n_counter ) * $o_bannerValues->views ) - $o_bannerValues->value; // get the smallest difference if( $n_difference <= $n_miniDiverenz ) { $n_miniDiverenz = $n_difference; $n_anbieter = $n_indexKey; } } // return the next banner return $n_anbieter; } |
Feedback erwünscht …





1 Kommentare
Danke für die Hilfe, tolle Seite!
Kommentar schreiben