2012-03-01 5 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의이 목록을 아래로 간다.

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

당신은 오름차순으로 배열을 정렬하고 첫 번째 항목을 선택하는 것이 어떻습니까? 이렇게하면 항상 가장 바쁜 서버를 선택하지 않을 것입니다. – Yaniro

+0

왜 임의의 것을 고르고 싶습니까? 무게가 가장 낮은 것을 사용하면 안 될까요? –

+0

Yaniro와 Emil Vikström, 네, 그렇게 할 수있을 것 같아요. 하지만 500 행에 체중이 1 인 경우 어떻게됩니까? 항상 무작위로 하나를 선택합니까? – 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 ]; 
관련 문제