Profilo di 磊Mrgaolei的BlogFotoBlogElenchi Strumenti Guida

Blog


16 gennaio

PHP 计算权重算法

假设有一堆服务器,我根据他们的配置给他们打分,想通过一个函数,随机的到一个服务器实例,当然不是百分百随机,而是配置越高的服务器得到几率越高,这就是权重。写了半天写出来了个算法,不过目前还有有一点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.1 参数类型不能定义成基础类型的问题

在PHP 5.2.5中,可以按照如下方法声明函数

function getProductById(int $id);

而在PHP 5.2.1中,调用时则会报错,具体原因未知。