2011-08-30 9 views
0

나는 사람들을 짝 지어주는 추첨을 만들고있다. 그래서 어떤 아이템도 같은 장소에서 끝나지 않는 배열에서 문자열을 섞는 방법을 원합니다. (당신은 자신과 짝을 지을 수 없습니다)무작위 셔플?

public function shuffleSantas(){ 
    $query = $this->db->get('person'); 
    $givers = array(); 
    $recievers = array(); 
    foreach($query->result() as $row):   
     $givers[] = $row->name; 
     //here i want a random order, but no name can be on the same place as in $givers! 
     $recievers[] = ''; 
    endforeach; 
+1

어쩌면 1 개의 큰 배열을 셔플()하고 반으로 분할 할 수 있습니까? –

+0

['array_rand()'] (http://www.php.net/array_rand)를 살펴볼 수 있습니다. – binaryLV

답변

-2

그런 식으로 셔플을 PHP에 내장 된 기능이라고 생각한다면. 자신 만의 함수를 작성해야합니다.

+0

사실, 그러나 그 질문은 "pls는 나에게 코드를 제공하는 것"으로 보였습니다. –

1
$src = $query->result(); 
$givers = array(); 
$receivers = array(); 
foreach ($src as $idx=>$first_person){ 
    $count = 0; //infinite loop guard 
    do{ 
     ++$count; 
     $sec_idx = rand(0,count($src)-1); 
     $second_person = $src[$sec_idx]; 
    } while ($second_person==$first_person && $count<5); 
    $givers[] = $first_person; 
    $receivers[] = $second_person; 
} 

이 경우 한 사람에게서 수신하여 다른 사람에게 줄 수 있습니다. 괜찮습니까? 또한이 알고리즘은 최적이 아니며 배열에 사람이 한 명만 있으면 무한 루프에 빠지게됩니다.

+0

결과가 이상 할 때 어떻게됩니까? –

+0

나는 그것이 틀렸다는 것을 나는 생각한다 : 각자는주는 사람이고 ** 수신기이다. 당신의 기능을 사용하면 많은 사람들만큼 선물이 있습니다. 그리고 사람들의 숫자는 이상합니다. 사람은 선물이 없습니다. –

+0

@Clement 'do ... while' 루프에서 항상 조건을 혼합하여 약간 업데이트되었습니다. @Vince 완전히 코드를 다시 작성, 지금은 확실히 작동합니다. – J0HN

3

배열을 한 번 섞은 다음 첫 번째 요소를 두 번째 요소, 두 번째 요소를 세 번째 요소 등으로 짝 지어서 마지막 요소를 첫 번째 요소와 짝을 짓습니다.

+0

그런 접근 방식은 단일 요소가 그 자체와 쌍을 이루지 않는다고 보장하지 않습니다. – J0HN

+0

죄송합니다, 당신 맞습니다 :) – J0HN

+0

굉장히 우아한 솔루션! (또한 @ J0HN 내가 잘못 생각한 것처럼 upvote 수 있도록 약간 편집) –