pierre@1
|
1 <?php |
pierre@1
|
2 // $Id: ad_weight_probability.inc,v 1.1.4.3 2009/02/28 05:48:42 jeremy Exp $ |
pierre@1
|
3 |
pierre@1
|
4 /** |
pierre@1
|
5 * @file |
pierre@1
|
6 * A plug in for the ad.module, allowing an admin to set the probability that |
pierre@1
|
7 * a given advertisement will be displayed. |
pierre@1
|
8 * |
pierre@1
|
9 * Copyright (c) 2008-2009. |
pierre@1
|
10 * Jeremy Andrews <jeremy@tag1consulting.com>. |
pierre@1
|
11 */ |
pierre@1
|
12 |
pierre@1
|
13 function ad_weight_probability_cache_filter($ads) { |
pierre@1
|
14 $display = array(); |
pierre@1
|
15 if (is_array($ads)) { |
pierre@1
|
16 $probability = array(); |
pierre@1
|
17 $cache = adserve_cache('get_cache', 'weight'); |
pierre@1
|
18 foreach ($ads as $aid) { |
pierre@1
|
19 $probability[] = isset($cache['probability'][$aid]) ? $cache['probability'][$aid] : 0; |
pierre@1
|
20 } |
pierre@1
|
21 $gcd = ad_weight_probability_gcd($probability); |
pierre@1
|
22 _debug_echo("ad_weight_probability cache_filter gcd($gcd)"); |
pierre@1
|
23 foreach ($ads as $aid) { |
pierre@1
|
24 $weight = (isset($cache['probability'][$aid]) && $gcd) ? $cache['probability'][$aid] / $gcd : 0; |
pierre@1
|
25 _debug_echo("ad_weight_probability cache_filter aid($aid) weight($weight)"); |
pierre@1
|
26 for ($i = 1; $i <= $weight; $i++) { |
pierre@1
|
27 $display[] = $aid; |
pierre@1
|
28 } |
pierre@1
|
29 } |
pierre@1
|
30 } |
pierre@1
|
31 return $display; |
pierre@1
|
32 } |
pierre@1
|
33 |
pierre@1
|
34 /** |
pierre@1
|
35 * Returns the greatest common divisor of an array of integers. |
pierre@1
|
36 */ |
pierre@1
|
37 function ad_weight_probability_gcd($integers) { |
pierre@1
|
38 $gcd = array_shift($integers); |
pierre@1
|
39 |
pierre@1
|
40 while (!empty($integers)) { |
pierre@1
|
41 $gcd = _ad_weight_probability_gcd($gcd, array_shift($integers)); |
pierre@1
|
42 } |
pierre@1
|
43 return $gcd; |
pierre@1
|
44 } |
pierre@1
|
45 |
pierre@1
|
46 /** |
pierre@1
|
47 * Helper function to calculate the greatest common divisor using the Euclidean |
pierre@1
|
48 * algorithm (http://en.wikipedia.org/wiki/Euclidean_algorithm). |
pierre@1
|
49 */ |
pierre@1
|
50 function _ad_weight_probability_gcd($a, $b) { |
pierre@1
|
51 if ($b == 0) { |
pierre@1
|
52 return $a; |
pierre@1
|
53 } |
pierre@1
|
54 else { |
pierre@1
|
55 return _ad_weight_probability_gcd($b, $a % $b); |
pierre@1
|
56 } |
pierre@1
|
57 } |