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横轴的那段区间上,存在则返回数据。如图: