广告权重 redis 广告权重测试_权重



java 版:http://www.blogjava.net/willpower88/archive/2010/08/31/330437.html

<?php
class Demo {
    
    /**
     * 广告按权重展现
     * @param array $weights
     * @access public
     * @return array
     * @update 2013-08-05
     */
    public function weights($weights) {
        if (!$weights && !is_array($weights)) {
            return array();
        }
        $total = 0;//权重总和
        foreach ($weights as $k=>$v) {
            $total += $weights['weight'];
            $weights[$k]['range'] = $total;
        }
        if ($total > 0) {
            $rd = mt_rand(1, $total);//随机数
            foreach ($weights as $val) {
                if ($val['range'] >= $rd) {
                    return $v;
                }
            }
        }
        return array();
    }
}
$weights = array(
    array('weight'=>3),
    array('weight'=>4),
    array('weight'=>5)
);
$obj = new Demo();
$res = $obj->weights($weights);
var_dump($res);
?>
<?php
class Demo {
    
    /**
     * 广告按权重展现
     * @param array $weights
     * @access public
     * @return array
     * @update 2013-08-05
     */
    public function weights($weights) {
        if (!$weights && !is_array($weights)) {
            return array();
        }
        $total = 0;//权重总和
        foreach ($weights as $k=>$v) {
            $total += $weights['weight'];
            $weights[$k]['range'] = $total;
        }
        if ($total > 0) {
            $rd = mt_rand(1, $total);//随机数
            foreach ($weights as $val) {
                if ($val['range'] >= $rd) {
                    return $v;
                }
            }
        }
        return array();
    }
}
$weights = array(
    array('weight'=>3),
    array('weight'=>4),
    array('weight'=>5)
);
$obj = new Demo();
$res = $obj->weights($weights);
var_dump($res);
?>

感觉没什么好说的。可以这么理解,把权重总和看作是0为起点的x横轴,每个广告的权重在x横轴上的一段位置,生成一个随机值,循环判断此随机值是否在当前广告权重所在的x横轴的那段区间上,存在则返回数据。如图:


广告权重 redis 广告权重测试_php_02