Mercurial > defr > drupal > ad
diff weight/probability/ad_weight_probability.inc @ 1:948362c2a207 ad
update advertisement
author | pierre |
---|---|
date | Thu, 02 Apr 2009 15:28:21 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/weight/probability/ad_weight_probability.inc Thu Apr 02 15:28:21 2009 +0000 @@ -0,0 +1,57 @@ +<?php +// $Id: ad_weight_probability.inc,v 1.1.4.3 2009/02/28 05:48:42 jeremy Exp $ + +/** + * @file + * A plug in for the ad.module, allowing an admin to set the probability that + * a given advertisement will be displayed. + * + * Copyright (c) 2008-2009. + * Jeremy Andrews <jeremy@tag1consulting.com>. + */ + +function ad_weight_probability_cache_filter($ads) { + $display = array(); + if (is_array($ads)) { + $probability = array(); + $cache = adserve_cache('get_cache', 'weight'); + foreach ($ads as $aid) { + $probability[] = isset($cache['probability'][$aid]) ? $cache['probability'][$aid] : 0; + } + $gcd = ad_weight_probability_gcd($probability); + _debug_echo("ad_weight_probability cache_filter gcd($gcd)"); + foreach ($ads as $aid) { + $weight = (isset($cache['probability'][$aid]) && $gcd) ? $cache['probability'][$aid] / $gcd : 0; + _debug_echo("ad_weight_probability cache_filter aid($aid) weight($weight)"); + for ($i = 1; $i <= $weight; $i++) { + $display[] = $aid; + } + } + } + return $display; +} + +/** + * Returns the greatest common divisor of an array of integers. + */ +function ad_weight_probability_gcd($integers) { + $gcd = array_shift($integers); + + while (!empty($integers)) { + $gcd = _ad_weight_probability_gcd($gcd, array_shift($integers)); + } + return $gcd; +} + +/** + * Helper function to calculate the greatest common divisor using the Euclidean + * algorithm (http://en.wikipedia.org/wiki/Euclidean_algorithm). + */ +function _ad_weight_probability_gcd($a, $b) { + if ($b == 0) { + return $a; + } + else { + return _ad_weight_probability_gcd($b, $a % $b); + } +}