按随机顺序将数组项同等地分配给另一个数组

时间:2017-03-20 20:38:53

标签: php arrays equality divide array-unset

标题几乎是不言自明的,所以我会直接解决问题。

我们假设我有一些像这样的项目数组:

$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个治安官。)

2 个答案:

答案 0 :(得分:1)

如果参与者数量小于或等于角色,则此方法有效。随机化角色数组:

shuffle($classicRoles);

然后在循环中,从roles数组中删除一个并分配给新数组:

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

如果你有更多的参与者而不是角色,你没有规定会发生什么,但是:

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

答案 1 :(得分:0)

对于roles数组的每个元素,从users数组中挑选一个随机用户(array_rand()),并从可用用户数组中删除给定的用户密钥。

这应该可以解决问题。

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