无法使用PHP

时间:2016-01-24 12:54:38

标签: php arrays foreach while-loop

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

我正在尝试自动将学生分配给随机且相等(或大致相等,如果分配了奇数)组。现在,我只是想尝试生成小组作业。稍后此信息将存储在数据库中(尚未存在),教师将能够修改组的数量。

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

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);
?>

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我建议你采用更简单,更清洁的方法。

4组示例:

  1. 随机顺序对学生进行随机播放
  2. 分配组0,1,2,3,0,1,2,3,0,1,2,3等。
  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);
    

答案 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.

中读取该内容