2012-03-01 26 views
0

ここには多くの似たような質問がありますが、私のコードで正しく実装するのに問題があります。PHP:配列からランダム加重インデックスを選択してください

私はID、IP、ポート、重量をデータベースから引き出しており、そこからは非常に軽い(最近使用されていない)ランダム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が選択されておらず、過半数が何度も何度も繰り返し使用されています。

ヤニロのおかげで、私はより良い解決策を思いつきました。

マイコード:

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

あなたはちょうど昇順でウェイトで配列をソートし、最初のエントリを選ぶのはどうですか?これは、あなたが常に最も使用頻度の低いサーバーを選択することを保証しませんか? – Yaniro

+0

なぜあなたはランダムなものを選んでいますか?一番小さい体重のものを使うことはできませんでしたか? –

+0

ヤニロとエミール・ヴィクトローム、ええ、私はそれをすることができたと思う。しかし、もし私が体重1の500行を持っていたらどうしますか? – PaulM

答えて

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 ]; 
関連する問題