2011-08-30 86 views
0

我創建一個彩票來配對人。所以我想要一種方法來將一個數組中沒有項目結束的數組中的字符串混洗在同一個地方。 (你不能與自己配對)隨機洗牌在PHP?

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個大陣列做一個shuffle()並將其分成兩半? –

+0

你可能想看看['array_rand()'](http://www.php.net/array_rand)。 – binaryLV

回答

-2

如果覺得在PHP中沒有內置函數來洗牌。你必須編寫你自己的功能。

+0

事實上,無論那個問題太過「請給我代碼」,以提出更好的答案,不是嗎? –

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一樣,我認爲這是錯誤的) –