Mercurial > defr > drupal > ad
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 } |