簡體   English   中英

PHP:從數組中選擇隨機加權索引

[英]PHP: Select random weighted index from Array

我知道這里有很多類似的問題,但是我在代碼中正確實現它時遇到了麻煩。

我從數據庫中提取ID,IP,端口和權重,然后從那里我希望能夠選擇一個權重非常低的隨機IP(最近未使用)。

這是結果集的子集。 完整列表在這里

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未被選中,而大多數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;
}   

誰能提供更好的代碼?

謝謝

您可以按權重升序對陣列進行排序,然后選擇第一個元素,這將確保選擇最不繁忙的服務器。

您的代碼看起來不錯,您也可以使用: 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 ];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM