这是我对堆栈溢出的第一个问题。我是一个新手。
我正在尝试自动将学生分配给随机且相等(或大致相等,如果分配了奇数)组。现在,我只是想尝试生成小组作业。稍后此信息将存储在数据库中(尚未存在),教师将能够修改组的数量。
我可以让学生分配到不同的随机组,但不会将他们平分。我觉得问题在于:
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);
?>
我做错了什么?
答案 0 :(得分:1)
我建议你采用更简单,更清洁的方法。
4组示例:
你可以像这样实现它:
<?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);
答案 1 :(得分:0)
为什么您的$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);
我让vars更具可读性。并将学生小组分成一个阵列。
如果你得到一个奇数的学生,你最终会得到一个有+1个学生的小组。
我认为你的问题是试图将学生随机分配到小组中,按顺序将他们分配到小组中将确保小组有相同数量的学生。
对于$key % $class_groups
值,它使用'模数'php的算术运算符。
计算机语言中的“mod”运算符就是其余部分。对于 例如,
17 mod 3 = 2
,因为
17/3 = 5 rem 2
反过来意味着
17 = 3 * 5 + 2
使用负数时有一些棘手的问题,但那样 通常不一定是必要的。
在数学(数论)中,该术语的使用方式略有不同。该 “模数”实际上不是余数,而是你的数字 除以;并且“mod”不是运算符,而是一个标记“in 什么意义上两个数量被认为是一致的,或相等的。“对于 例如,我们会说
17 = 11(mod 3)
(读作“17与11一致,模3”),意思是17和11 当除以3时,两者都留下相同的余数。你可能不会 如果您只是阅读有关编程的内容,请参阅此用法,但确实如此 值得注意的是,如果你深入研究它背后的数学。
您可以从here.
中读取该内容