如何在PHP中将用户排序为不同大小的组?

时间:2015-05-27 02:36:05

标签: php arrays sorting

此处的任务是将成员列表随机分配到位于全国各地的不同位置。每个位置都有一个唯一的最大成员数量。

我有两个阵列。一个包含用户列表,另一个包含具有最小/最大大小的组列表。

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语句。但就本篇文章而言,数组会没问题。

1 个答案:

答案 0 :(得分:1)

假设您需要从最小的最大值填充,直到没有用户离开或直到群组已满,您首先需要在群组中找到最小的最大值。

我认为这里的解决方案是按照升级顺序将组结构重新排序为max的排序器:

usort($groups, function($a, $b) {
    return $a["max"] > $b["max"];
});

然后你需要一个存储来保持你的关系。在这里的示例中,我们将使用一个数组。我们称之为$userGroups

按照max按升序对组进行排序后,首先是max = 4的组,然后是max = 10等的组...

因此,您可以简单地遍历$groups数组。在第一次迭代中,您点击了groupId = 4。开始从零开始迭代到最大组或用户离开(group['max'] = 4users = 5,因此您将迭代到4

$max = min($group['max'], count($users));
for ($i = 0; $i < $max; $i++)

在每次迭代中,将当前索引上的用户添加到关系数组$userGroups中,并从数组中弹出一个元素(可能是array_poparray_splice?)。这将开始让用户从第一个id到最后一个id。要实现随机性,您可以shuffle()数组。

完成后,将有4位用户被分配到groupId = 4,一位用户将离开。

然后你击中了下一组。 groupId = 7min($group['max'], count($users));。现在groupMax = 10将在users = 1min(10, 1) = 1之间进行选择,{{1}}。因此,您将从0迭代到1(一次迭代)并将唯一一个左用户分配给该组。其他组将没有用户。

这是我能想象的最合理的场景。但也许您有一个用户可以属于一个或多个组的场景,那么您可能不需要从阵列中弹出任何内容。