以随机顺序将数组项除以平均分配数组 php

Divide Array Items To Anothe Array Equally In Random Order Php

提问人:Volo Apps 提问时间:3/21/2017 最后编辑:Cave JohnsonVolo Apps 更新时间:3/21/2017 访问量:87

问:

标题几乎是不言自明的,所以我将直接进入问题。

假设我有一个包含如下项的数组:

$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 个警长。

php 相等 数组未设置

评论

0赞 AbraCadaver 3/21/2017
那么,如果参与者多于角色,会发生什么情况?
0赞 Volo Apps 3/24/2017
这永远不会发生,因为角色数组总是大于参与者数组

答:

1赞 AbraCadaver 3/21/2017 #1

如果参与者计数小于或等于角色,则此方法有效。随机排列角色数组以使其随机化:

shuffle($classicRoles);

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

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

你没有规定如果参与者多于角色,会发生什么,但类似这样:

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

评论

0赞 Volo Apps 3/21/2017
你是对的,我没有指定这种情况,虽然足够清楚,但正如您在数组中看到的那样,角色被划分为数组计数的数量,这是最大的数量,因此用户数组永远不会超过角色数组,假设我们正在与 20 名玩家一起玩 yakudza,因此,角色数组将包含 20 个项目
0赞 Volo Apps 3/21/2017
我现在将使用此代码,看看它是如何工作的,因为array_pop没有出现在我的脑海中
0赞 Marc Brillault 3/21/2017 #2

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

这应该可以解决问题。

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