[英]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.