无法使用 PHP 将用户分配到相等的组中


Can't distribute users into equal groups using PHP

这是我对堆栈溢出提出的第一个问题。我有点新手。

我正在尝试自动将学生分配到随机和相等(如果分配了奇数,则基本相等)组。现在,我只是在尝试生成小组作业。稍后,此信息将存储在数据库中(尚未存储),教师将能够修改组数。

我可以将学生分配到不同的随机组,但它不会平均分配他们。我觉得问题出在:

while ($rand_num == $value && $group_count[$rand_num] >= $group_size)

它似乎没有进行比较或忽略 &&& 之后的所有内容。

<?php
$group_array = array("Abby" => 0 , "Billy" => 0 , "Cathy" => 0 , "Dillan" => 0, "Elizabeth" => 0 , "Fred" => 0 , "Geofery" => 0 , "Hank" => 0, "Ingrid" => 0 , "Jacob" => 0 , "Kylie" => 0 , "Lenord" => 0);
$class_size = count($group_array);
$num_groups = 3;
$group_size = $class_size / $num_groups;
$group_count = (array_count_values($group_array));
foreach ($group_array as $key => &$value) {
    $rand_num = rand(1 , $num_groups);      
    while ($rand_num == $value && $group_count[$rand_num] >= $group_size) {
        $rand_num = rand(1 , $num_groups);
    };
    $value = $rand_num;
    $group_count = (array_count_values($group_array));
};
//Group Assignments
var_dump($group_array);
//Users in each group
var_dump($group_count);
?>

我做错了什么?

我建议你一个更简单、更干净的方法。

4 组的示例:

  1. 随机随机排列学生
  2. 分配组 0、1、2、3、0、1、2、3、
  3. 0、1、2、3 等。

你可以这样实现它:

<?php
$n_groups = 4;
$students = array("Abby", "Billy", "Cathy", "Dillan", "Elizabeth", "Fred",
    "Geofery", "Hank", "Ingrid", "Jacob", "Kylie", "Lenord");
shuffle($students);  // put students in random order
$groups = []; // init empty groups
foreach($students as $position => $student) {
    $groups[$student] = $position % $n_groups;  // put student into group based on his position (first student gets 0, then 1, 2, 3, then 0 again etc.)
}
print_r($groups);

为什么你的$group_array有学生的名字作为密钥?有什么目的吗?

我想出了这个:

$students_array = ['Abby', 'Billy', 'Cathy', 'Dillan', 'Elizabeth', 'Fred', 'Geofery', 'Hank', 'Ingrid', 'Jacob', 'Kylie', 'Lenord', 'Katy'];
shuffle($students_array);
$class_groups = 3;
$groups = [];
foreach ($students_array as $key => $student) {
    
    $assigned_group = $key % $class_groups;
    $groups[$assigned_group][] = $student;      
}
print_r($groups);

我使变量更具可读性。并将学生组放入一个阵列中。

如果你的学生人数为奇数,你最终会得到一个有+1名学生的小组。

我认为您的问题是试图将学生随机分配到组中,将他们按顺序分配到组中将确保小组的学生人数相等。

至于$key % $class_groups值,它使用"模数"php的算术运算符。

计算机语言中的"mod"运算符只是其余部分。为例

17 模 3 = 2

因为

17/3 = 5 rem 2

这反过来意味着

17 = 3 * 5 + 2

使用负数时存在一些棘手的问题,但是通常不应该是必需的。

在数学(数论)中,该术语的使用略有不同。这"模数"实际上不是余数,而是你的数字除以;而"mod"不是运算符,而是一个标签,告诉"在什么意义两个量被认为是全等的,或相等的。例如,我们会说

17 = 11 (模数 3)

(读作"17 与 11 全等,模 3"),意思是 17 和 11除以 3 时,两者都保留相同的余数。你可能不会如果您只是在阅读有关编程的信息,请参阅此用法,但它是如果您深入研究其背后的数学,值得注意。

你可以从这里阅读。