PHP:从Array中选择随机加权索引

时间:2012-03-01 13:50:58

标签: php php-5.3

我知道这里有很多类似的问题,但我在代码中无法正确实现它。

我从数据库中提取id,ip,port和weight,从那里我希望能够选择权重非常低的随机ip(最近没有使用过)。

这是结果集的子集。完整列表为here

id  ip  port  weight  tries
174  127.0.0.1  3128  906  0
101  127.0.0.1  8080  629  2
123  127.0.0.1  3128  433  3
226  127.0.0.1  3128  393  1
82  127.0.0.1  8080  333  2
252  127.0.0.1  8080  276  3
253  127.0.0.1  3128  209  0
240  127.0.0.1  3129  204  1
249  127.0.0.1  3128  190  0
261  127.0.0.1  8888  165  1
120  127.0.0.1  3128  161  3
188  127.0.0.1  8080  149  0
265  127.0.0.1  8080  108  1
275  127.0.0.1  8080  104  0
63  127.0.0.1  8080  95  2
196  127.0.0.1  8080  79  2
248  127.0.0.1  8080  73  1
223  127.0.0.1  8000  72  3
88  127.0.0.1  3128  69  3
422  127.0.0.1  8080  47  0

在列表中我有很多ip,它们没有被选中,而且大部分都被反复使用。

感谢Yaniro,我想出了一个更好的解决方案。

我的代码:

private function _weighted_random_simple($proxies)
{
    foreach ($proxies as $proxy) {
        $weight[] = $proxy['weight'];           
    }

    array_multisort($weight, SORT_ASC, $proxies);

    // Define the custom sort function
    $proxie = array(
        'id' => $proxies[0]['id'], 
        'ip' => $proxies[0]['ip'], 
        'port' => $proxies[0]['port'], 
        'weight' => $proxies[0]['weight'], 
        'tries' => $proxies[0]['tries']
    );

    return $proxie;
}   

任何人都可以提供更好的代码吗?

由于

1 个答案:

答案 0 :(得分:0)

您可以按权重按升序对数组进行排序,然后选择第一个保证选择最不忙的服务器的元素。

您的代码似乎很好,您也可以使用:usort()uasort(),如下所示:

function cmp( $a, $b )
{
    if ( $a[ 'weight' ] == $b[ 'weight' ] )
    {
        return 0;
    }

    return ( $a[ 'weight' ] < $b[ 'weight' ] ) ? -1 : 1;
}

usort( $fruits, "cmp" );

如果您希望比较函数成为您课程的一部分,请执行以下操作:

class YourClass
{
    static function cmp( $a, $b )
    {
        if ( $a[ 'weight' ] == $b[ 'weight' ] )
        {
            return 0;
        }

        return ( $a[ 'weight' ] < $b[ 'weight' ] ) ? -1 : 1;
    }

    private function _weighted_random_simple( $proxies )
    {
        usort( $proxies, array( "YourClass", "cmp" ) );
        return $proxies[ 0 ];
    }
}

或者只是遍历数组,找到最低权重并返回其索引:

$lowest = -1;
$index  = 0;

for ( $i = 0; $i < count( $proxies ); ++$i )
{
    if ( $proxies[ $i ][ 'weight' ] < $lowest || $lowest == -1 )
    {
        $lowest = $proxies[ $i ][ 'weight' ];
        $index  = $i;
    }
}

return $proxies[ $index ];