16 gennaio
假设有一堆服务器,我根据他们的配置给他们打分,想通过一个函数,随机的到一个服务器实例,当然不是百分百随机,而是配置越高的服务器得到几率越高,这就是权重。写了半天写出来了个算法,不过目前还有有一点Bug,就是权重值不能有重复的,否则重复的永远不会得到。
<?php
/**
* 权重DEMO
*/
$data = array(
array('server1', 5),
array('server2', 10),
array('server3', 5),
array('server4', 7),
array('server5', 3),
array('server6', 31)
);
var_dump(checkWeight($data));
function checkWeight($data) {
# 权重和
$sum = 0;
# 权重值不能有负数
foreach ($data as $val) {
if ($val[1] < 0) return false;
$sum += $val[1];
}
# 根据权重数排序
$sorted = true;
while ($sorted) {
$sorted = false;
for ($i = 0; $i < count($data) - 1; $i ++) {
if ($data[$i][1] < $data[$i + 1][1]) {
swapvar(&$data[$i], &$data[$i + 1]);
$sorted = true;
}
}
}
# 产生随机数,最小1,最大权重和
$randnum = rand(1, $sum);
echo $randnum;
# 如果随机数大于等于最大值,返回最大
if ($randnum >= $data[0][1]) return $data[0][0];
# 如果随机数小于最小值,返回最小
if ($randnum < $data[count($data) - 1][1]) return $data[count($data) - 1][0];
for ($i = 0; $i < count($data) - 1; $i ++) {
if ($randnum < $data[$i][1]) $current = $data[$i+1][0];
}
return $current;
}
function swapvar(&$var1, &$var2) {
$tmpvar = $var1;
$var1 = $var2;
$var2 = $tmpvar;
}
14 gennaio
在PHP 5.2.5中,可以按照如下方法声明函数
function getProductById(int $id);
而在PHP 5.2.1中,调用时则会报错,具体原因未知。