2017-03-20 84 views
2

標題是非常不言自明,所以我會直奔問題。鴻溝陣列項目要Anothe陣列同樣以隨機順序腓

假設我有一些項目像這樣的數組:

$classicRoles = [ 
    'mafia', 
    'mafia', 
    'don', 
    'civilian', 
    'civilian', 
    'civilian', 
    'civilian', 
    'civilian', 
    'civilian', 
    'sherif' 
]; 

現在執行查詢我得到下一個陣列

while ($participantAssoc = mysqli_fetch_assoc($participantsQuery)) { 
    $pushArray['room_id'] = $participantAssoc['room_id']; 
    $pushArray['participant_id'] = $participantAssoc['participant_id']; 
    $pushArray['id'] = $participantAssoc['id']; 
    $pushArray['role'] = $participantAssoc['role']; 
    $pushArray['eliminated'] = $participantAssoc['eliminated']; 
    array_push($participantsArray, $pushArray); 
} 

一切都很好,在這裏,除非我試了下項目。

我想給每個參與者的角色:2點黑手黨的角色,1個唐作用,6名平民和1名警長。

的問題是,我不能讓它在所有的工作。

所以參與者數只能爲1項不同,但我們甚至假設參與者數量和角色數完全相等。所以現在,任何人都可以告訴我如何讓PHP數組內的上述邏輯發生? (給每個參與者角色:2個黑手黨角色,1個別作用,6名平民和1名警長。)

+0

那麼如果你有更多的參與者比角色會發生什麼? – AbraCadaver

+0

永遠不會發生,因爲角色的陣列總是比參與者陣列更大 –

回答

1

這適用如果參與者計數小於或等於的角色。洗牌角色的陣列以隨機它:

shuffle($classicRoles); 

然後在循環,從中刪除角色陣列並分配到新陣列:

$pushArray['role'] = array_pop($classicRoles); 

您還沒有規定應該發生什麼,如果你比角色更多的參與者,但類似:

if(count($classicRoles) > 0) { 
    $pushArray['role'] = array_pop($classicRoles); 
} else { 
    break; 
} 
+0

你是對的,我並沒有說明這種情況下,雖然夠清楚了,但你可以在陣列中看到角色被分爲數組數的數目是最大,所以它不會發生,用戶數組將不止是角色的數組,我們假設我們正在玩20個玩家的yakudza,所以角色數組將包括20個項目 –

+0

我現在將使用此代碼並查看如何它的作品array_pop沒有進入我的腦海,雖然 –

+0

拯救生命!!!!像魅力一樣工作!謝謝! –

0

爲了您的角色數組的每個元素,從挑選您的用戶陣列(array_rand())隨機用戶,並刪除從可用用戶數組中給出用戶密鑰。

這應該做的伎倆。

foreach($classicRoles as $role) { 
    $userKey = array_rand($participantAssoc); 
    $currentUser = $participantAssoc[$userKey]; 
    $currentUser['role'] = $role; 
    $participantsArray[] = $currentUser; 
    unset($participantAssoc[$userKey]); 
}