此处的任务是将成员列表随机分配到位于全国各地的不同位置。每个位置都有一个唯一的最大成员数量。
我有两个阵列。一个包含用户列表,另一个包含具有最小/最大大小的组列表。
Array(
[0] => Array(
[userid] => 1[name] => "luke"
) [1] => Array(
[userid] => 2[name] => "peter"
) [2] => Array(
[userid] => 3[name] => "joe"
) [3] => Array(
[userid] => 4[name] => "mark"
) [4] => Array(
[userid] => 5[name] => "bob"
)
)
想象一下上面的数组可以扩展300多个用户。
Array(
[0] => Array(
[planid] => 1[group] => 1[eventid] => 37[min] => 0[max] => 999
) [1] => Array(
[planid] => 2[group] => 2[eventid] => 37[min] => 0[max] => 999
) [2] => Array(
[planid] => 3[group] => 12[eventid] => 37[min] => 0[max] => 15
) [3] => Array(
[planid] => 4[group] => 13[eventid] => 37[min] => 0[max] => 4
) [4] => Array(
[planid] => 5[group] => 16[eventid] => 37[min] => 0[max] => 16
) [5] => Array(
[planid] => 6[group] => 14[eventid] => 37[min] => 0[max] => 16
) [6] => Array(
[planid] => 7[group] => 15[eventid] => 37[min] => 0[max] => 10
)
)
如何创建一个可以随意将用户分配到组中的函数,先填充最大值较小的组?
数组中的数据来自数据库,其中包含一个存储已分配用户组的单独表。
所需的输出将不可避免地成为将信息存储回数据库的SQL语句。但就本篇文章而言,数组会没问题。
答案 0 :(得分:1)
假设您需要从最小的最大值填充,直到没有用户离开或直到群组已满,您首先需要在群组中找到最小的最大值。
我认为这里的解决方案是按照升级顺序将组结构重新排序为max
的排序器:
usort($groups, function($a, $b) {
return $a["max"] > $b["max"];
});
然后你需要一个存储来保持你的关系。在这里的示例中,我们将使用一个数组。我们称之为$userGroups
。
按照max
按升序对组进行排序后,首先是max = 4
的组,然后是max = 10
等的组...
因此,您可以简单地遍历$groups
数组。在第一次迭代中,您点击了groupId = 4
。开始从零开始迭代到最大组或用户离开(group['max'] = 4
和users = 5
,因此您将迭代到4
)
$max = min($group['max'], count($users));
for ($i = 0; $i < $max; $i++)
在每次迭代中,将当前索引上的用户添加到关系数组$userGroups
中,并从数组中弹出一个元素(可能是array_pop
,array_splice
?)。这将开始让用户从第一个id到最后一个id。要实现随机性,您可以shuffle()
数组。
完成后,将有4位用户被分配到groupId = 4
,一位用户将离开。
然后你击中了下一组。 groupId = 7
。min($group['max'], count($users));
。现在groupMax = 10
将在users = 1
和min(10, 1) = 1
之间进行选择,{{1}}。因此,您将从0迭代到1(一次迭代)并将唯一一个左用户分配给该组。其他组将没有用户。
这是我能想象的最合理的场景。但也许您有一个用户可以属于一个或多个组的场景,那么您可能不需要从阵列中弹出任何内容。