comparison channel/ad_channel.inc @ 2:e5584a19768b ad

maj module ad
author sly
date Wed, 15 Apr 2009 07:58:32 +0000
parents 948362c2a207
children 6aeff3329e01
comparison
equal deleted inserted replaced
1:948362c2a207 2:e5584a19768b
15 _debug_echo("ad_channel_cache: adserve_cache_filter"); 15 _debug_echo("ad_channel_cache: adserve_cache_filter");
16 16
17 $channels = adserve_cache('get_cache', 'channel'); 17 $channels = adserve_cache('get_cache', 'channel');
18 $valid = array(); 18 $valid = array();
19 $nochannel = array(); 19 $nochannel = array();
20 $nochannel_weight = array();
21 $matched_channel = array();
20 foreach ($ads as $aid) { 22 foreach ($ads as $aid) {
21 _debug_echo("ad_channel_cache: checking aid($aid)"); 23 _debug_echo("ad_channel_cache: checking aid($aid)");
22 if (is_array($channels['ads']) && isset($channels['ads'][$aid]) && 24 if (is_array($channels['ads']) && isset($channels['ads'][$aid]) &&
23 is_array($channels['ads'][$aid])) { 25 is_array($channels['ads'][$aid])) {
24 foreach ($channels['ads'][$aid] as $chid) { 26 foreach ($channels['ads'][$aid] as $chid) {
31 _debug_echo("ad_channel_cache: checking aid($aid) against channel($chid) path(". adserve_variable('url') .") regexp($regexp) match($match)"); 33 _debug_echo("ad_channel_cache: checking aid($aid) against channel($chid) path(". adserve_variable('url') .") regexp($regexp) match($match)");
32 if ($display == 0) { // display on all except listed urls 34 if ($display == 0) { // display on all except listed urls
33 if (empty($urls) || !$match) { 35 if (empty($urls) || !$match) {
34 _debug_echo("ad_channel_cache: aid($aid) is valid"); 36 _debug_echo("ad_channel_cache: aid($aid) is valid");
35 $valid[] = $aid; 37 $valid[] = $aid;
38 if ($display == 1) {
39 $nochannel_weight[$chid] = $channel->no_channel_weight;
40 }
41 $matched_channel[$aid] = $chid;
42 _debug_echo("ad_channel_cache: channel($channel->chid) no_channel_weight(". $nochannel_weight[$chid] .')');
36 break; 43 break;
37 } 44 }
38 } 45 }
39 else { // display only on listed urls 46 else { // display only on listed urls
40 if (!empty($urls) && $match) { 47 if (!empty($urls) && $match) {
41 _debug_echo("ad_channel_cache: aid($aid) is valid"); 48 _debug_echo("ad_channel_cache: aid($aid) is valid");
42 $valid[] = $aid; 49 $valid[] = $aid;
50 if ($display == 1) {
51 $nochannel_weight[$chid] = $channel->no_channel_weight;
52 }
53 $matched_channel[$aid] = $chid;
43 break; 54 break;
44 } 55 }
45 } 56 }
46 _debug_echo("ad_channel_cache: aid($aid) is not valid"); 57 _debug_echo("ad_channel_cache: aid($aid) is not valid");
47 } 58 }
64 break; 75 break;
65 } 76 }
66 } 77 }
67 } 78 }
68 79
69 if (empty($valid) && !empty($nochannel)) { 80 // Apply weights, applicable for advertisements that are not assigned to any
81 // channel.
82 if (!empty($valid) && !empty($nochannel_weight)) {
83 $weights = array();
84 foreach ($valid as $aid) {
85 if (isset($matched_channel[$aid])) {
86 $chid = $matched_channel[$aid];
87 if (isset($nochannel_weight[$chid])) {
88 $weights[$aid] = $nochannel_weight[$chid];
89 _debug_echo("ad_channel_cache: ad $aid in channel $chid with weight ". $nochannel_weight[$chid]);
90 }
91 else {
92 // by default, ads are assigned a weight of 100%
93 $weights[$aid] = 100;
94 _debug_echo("ad_channel_cache: ad $aid in channel $chid with default weight of 100");
95 }
96 }
97 else {
98 // by default, ads are assigned a weight of 100%
99 $weights[$aid] = 100;
100 _debug_echo("ad_channel_cache: ad $aid in no channel with default weight of 100");
101 }
102 }
103 if (!empty($weights)) {
104 $gcd = ad_channel_probability_gcd($weights);
105 $display = array();
106 _debug_echo("ad_channel_cache: adjusting channel weights, gcd ($gcd)");
107 foreach ($valid as $aid) {
108 $weight = $weights[$aid] / $gcd;
109 for ($i = 1; $i <= $weight; $i++) {
110 $display[] = $aid;
111 }
112 }
113 $valid = $display;
114 }
115 }
116 else if (empty($valid) && !empty($nochannel)) {
70 _debug_echo("ad_channel_cache: using ads with no channel info"); 117 _debug_echo("ad_channel_cache: using ads with no channel info");
71 $valid = $nochannel; 118 $valid = $nochannel;
72 } 119 }
73 120
74 $premiere = adserve_cache('get_cache', 'premiere'); 121 $premiere = adserve_cache('get_cache', 'premiere');
89 } 136 }
90 } 137 }
91 _debug_echo("ad_channel_cache: returning non-premiere advertisements"); 138 _debug_echo("ad_channel_cache: returning non-premiere advertisements");
92 return $valid; 139 return $valid;
93 } 140 }
141
142 /**
143 * Returns the greatest common divisor of an array of integers.
144 */
145 function ad_channel_probability_gcd($integers) {
146 $gcd = array_shift($integers);
147
148 while (!empty($integers)) {
149 $gcd = _ad_channel_probability_gcd($gcd, array_shift($integers));
150 }
151 return $gcd;
152 }
153
154 /**
155 * Helper function to calculate the greatest common divisor using the Euclidean
156 * algorithm (http://en.wikipedia.org/wiki/Euclidean_algorithm).
157 */
158 function _ad_channel_probability_gcd($a, $b) {
159 if ($b == 0) {
160 return $a;
161 }
162 else {
163 return _ad_channel_probability_gcd($b, $a % $b);
164 }
165 }