扩展阵列以增加其他要求 [英] Extend array with additional requirements

查看:50
本文介绍了扩展阵列以增加其他要求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是PHP的新手,但我会尽力而为.请耐心等待我.:)

I am new to PHP, but I do my best. Please be patient with me. :)

昨天我已经问过类似的问题,但是今天我必须延长它.

Yesterday I already asked a similar question, but today I have to extend it.

初始情况

在我的学校里,毕业生必须在最后一年选择一个主题作为论文.每个学生都从一个主题领域中选择一位导师来帮助他们.

In my school the graduates have to pick a topic for a thesis in the final year. Each student chooses a tutor from one subject area to help them.

开始位置

  • 每个学生必须准确地指定三个愿望,这些愿望按顺序排列偏好的降序.示例:史黛西(Stacy)选择乔布斯(Mr. Jobs)设计是她的第一个愿望,卡尔还选择了乔布斯先生作为他的第一个愿望.希望,但在可用性上.威廉姆斯(William)选择盖茨先生担任计算机科学作为他的第一选择,夏洛特选择了盖茨先生的生物学作为他的首选.
  • 每位导师最多可以指导三名学生.
  • 每个老师最多可以选择两个科目.这样乔布斯先生可以盖茨先生在计算机科学和生物学,马斯克(Musk)在物理和地理领域.

可能的选举示例:

Mr. Jobs -> Stacy (Design), Carl (Usability), Melody (Design)
Mr. Gates -> William (Computer Science), Eric (Biology), Charlott (Biology)
Mr. Musk -> Anthony (Physics), Sarah (Physics), Nelly (Geography)

最终问题

  • 我如何确保尽可能多的学生获得第一名希望?在其余的学生中,应尽可能多地第二个愿望,其余的第三个愿望.(完成?您有小费吗?)
  • 如何扩展以下脚本,以便使不同的主题我的同事人数已被考虑在内,但没有人监督更多超过三个学生?
  • 如何告诉脚本也输出分配是否为第一个愿望,第二个愿望还是第三个愿望?

用户 Rustyjim 昨天用以下脚本帮助了我.再次感谢!

User Rustyjim helped me yesterday with the following script. Thanks again!

最良好的祝愿,保持健康!

Best wishes, stay healthy!

到目前为止的脚本

function shuffle_assoc($list) {
    if (!is_array($list)) return $list;
    $keys = array_keys($list);
    shuffle($keys);
    $random = array();
    foreach ($keys as $key) {
        $random[$key] = $list[$key];
    }
    return $random;
}
$preferencesOfStudents = [
    'students' => [
        'Stacy' => ['Mr Jobs','Mr Gates','Mr Musk'],
        'Carl' => ['Mr Jobs','Mr Gates','Mr Musk'],
        'Melody' => ['Mr Jobs','Mr Musk','Mr Gates'],
        'William' => ['Mr Musk','Mr Gates','Mr Jobs'],
        'Eric' => ['Mr Gates','Mr Jobs','Mr Musk'],
        'Charlott' => ['Mr Jobs','Mr Gates','Mr Musk'],
        'Anthony' => ['Mr Gates','Mr Musk','Mr Jobs'],
        'Sarah' => ['Mr Gates','Mr Jobs','Mr Musk'],
        'Nelly' => ['Mr Gates','Mr Musk','Mr Jobs']
    ]
];
// 1 = Jobs, 2 = Gates, 3 = Musk
$teachers = [
    'Mr Jobs' => [],
    'Mr Gates' => [],
    'Mr Musk' => []
];
$randomStudentsArray = shuffle_assoc($preferencesOfStudents['students']);
//print_r($randomStudentsArray);
foreach($randomStudentsArray as $name => $student){
    if(count($teachers[$student[0]]) < 3){
        $teachers[$student[0]][] = $name;
    } elseif(count($teachers[$student[1]]) < 3) {
        $teachers[$student[1]][] = $name;
    } else {
        $teachers[$student[2]][] = $name;
    }
}
print_r($teachers);

推荐答案

是否有效?希望能对您有所帮助!

This works? Hope to help!

如果最多只能有2个专业,那么就会有一个问题:有时候并非所有学生都可以分配.

If there is a maximum of 2 specializations there is a problem though: not all students can be assigned sometimes.

但是尽力而为,而且是随机的,因此,如果输出效果不佳,请重试.

But is tries as well as it can, and random, so if it does not give a nice output, just try again.

   <?php
function shuffle_assoc($list) {
    if (!is_array($list)) return $list;
    $keys = array_keys($list);
    shuffle($keys);
    $random = array();
    foreach ($keys as $key) {
        $random[$key] = $list[$key];
    }
    return $random;
}
function searchForId($id, $array) {
    foreach ($array as $key => $val) {
        if ($val['specializations'] === $id) {
            return $key;
        }
    }
    return null;
 }
$preferencesOfStudents = [
    'students' => [
        'Stacy' => ['Mr Jobs','Mr Gates','Mr Musk', 'Biology'],
        'Carl' => ['Mr Jobs','Mr Gates','Mr Musk', 'Design'],
        'Melody' => ['Mr Bezos','Mr Musk','Mr Gates', 'Usability'],
        'William' => ['Mr Musk','Mr Gates','Mr Jobs', 'Computer Science'],
        'Eric' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics'],
        'Charlott' => ['Mr Jobs','Mr Gates','Mr Musk', 'Geography'],
        'Anthony' => ['Mr Gates','Mr Musk','Mr Jobs', 'Geography'],
        'Sarah' => ['Mr Gates','Mr Jobs','Mr Musk', 'Design'],
        'Nelly' => ['Mr Gates','Mr Musk','Mr Jobs', 'Usability'],
        'Connor' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics'],
        'Frodo' => ['Mr Gates','Mr Musk','Mr Jobs', 'Computer Science'],
        'Achmed' => ['Mr Gates','Mr Jobs','Mr Musk', 'Computer Science']
    ]
];

$teachers = [
    'Mr Jobs' => [
        'students' => [],
        'specializations' => []
    ],
    'Mr Gates' => [
        'students' => [],
        'specializations' => []
    ],
    'Mr Musk' => [
        'students' => [],
        'specializations' => []
    ],
    'Mr Bezos' => [
        'students' => [],
        'specializations' => []
    ]
];
$unassigned = [];
$randomStudentsArray = shuffle_assoc($preferencesOfStudents['students']);
/*assign students to prefered spots randomly*/
foreach($randomStudentsArray as $name => $student){
    foreach ($teachers as $teacherName => $array) {
        if (in_array($student[3],$array['specializations'])) {
            $teachers[$teacherName]['students'][] = $name." (because of specialization) (".$student[3].")";
            $teachers[$teacherName]['specializations'][] = $student[3];
            break;
        }
    }
    if(count($teachers[$student[0]]['students']) < 5 && count($teachers[$student[0]]['specializations']) < 2){   
        $teachers[$student[0]]['students'][] = $name." (first choice) (".$student[3].")";
        $teachers[$student[0]]['specializations'][] = $student[3]; 
    } elseif(count($teachers[$student[1]]['students']) < 5 && count($teachers[$student[1]]['specializations']) < 2) {
        $teachers[$student[1]]['students'][] = $name." (second choice) (".$student[3].")";
        $teachers[$student[1]]['specializations'][] = $student[3];
    } elseif(count($teachers[$student[2]]['students']) < 5 && count($teachers[$student[2]]['specializations']) < 2)  {
        $teachers[$student[2]]['students'][] = $name." (third choice) (".$student[3].")";
        $teachers[$student[2]]['specializations'][] = $student[3];
    } else {
        $unassigned[$name] = $student;
    }
}
/*assign unassigned student to free spots*/
foreach($unassigned as $name => $student){
    foreach($teachers as $teacherName => $listOfStudents){
        if(count($listOfStudents['students']) < 5 && count($listOfStudents['specializations']) < 2){
            $teachers[$teacherName]['students'][] = $name." (none of prefered choices) (".$student[3].")";
            $teachers[$teacherName]['specializations'][] = $student[3];
        }
    }
}
print_r($teachers);

<?php
function shuffle_assoc($list) {
    if (!is_array($list)) return $list;
    $keys = array_keys($list);
    shuffle($keys);
    $random = array();
    foreach ($keys as $key) {
        $random[$key] = $list[$key];
    }
    return $random;
}
function searchForId($id, $array) {
    foreach ($array as $key => $val) {
        if ($val['specializations'] === $id) {
            return $key;
        }
    }
    return null;
 }
$preferencesOfStudents = [
    'students' => [
        'Stacy' => ['Mr Jobs','Mr Gates','Mr Musk', 'Biology'],
        'Carl' => ['Mr Jobs','Mr Gates','Mr Musk', 'Design'],
        'Melody' => ['Mr Bezos','Mr Musk','Mr Gates', 'Usability'],
        'William' => ['Mr Musk','Mr Gates','Mr Jobs', 'Computer Science'],
        'Eric' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics'],
        'Charlott' => ['Mr Jobs','Mr Gates','Mr Musk', 'Geography'],
        'Anthony' => ['Mr Gates','Mr Musk','Mr Jobs', 'Geography'],
        'Sarah' => ['Mr Gates','Mr Jobs','Mr Musk', 'Design'],
        'Nelly' => ['Mr Gates','Mr Musk','Mr Jobs', 'Usability'],
        'Connor' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics'],
        'Frodo' => ['Mr Gates','Mr Musk','Mr Jobs', 'Computer Science'],
        'Achmed' => ['Mr Gates','Mr Jobs','Mr Musk', 'Computer Science']
    ]
];

$teachers = [
    'Mr Jobs' => [
        'students' => [],
        'specializations' => ['Biology', 'Design']
    ],
    'Mr Gates' => [
        'students' => [],
        'specializations' => ['Computer Science', 'Usability']
    ],
    'Mr Musk' => [
        'students' => [],
        'specializations' => ['Physics', 'Geography']
    ],
    'Mr Bezos' => [
        'students' => [],
        'specializations' => ['Usability', 'Biology']
    ]
];
$unassigned = [];
$randomStudentsArray = shuffle_assoc($preferencesOfStudents['students']);
/*assign students to prefered spots randomly*/
foreach($randomStudentsArray as $name => $student){
    if(count($teachers[$student[0]]['students']) < 5 && in_array($student[3],$teachers[$student[0]]['specializations'])){   
        $teachers[$student[0]]['students'][] = $name." (first choice) (".$student[3].")";
    } elseif(count($teachers[$student[1]]['students']) < 5 && in_array($student[3],$teachers[$student[1]]['specializations'])) {
        $teachers[$student[1]]['students'][] = $name." (second choice) (".$student[3].")";
    } elseif(count($teachers[$student[2]]['students']) < 5 && in_array($student[3],$teachers[$student[2]]['specializations']))  {
        $teachers[$student[2]]['students'][] = $name." (third choice) (".$student[3].")";
    } else {
        $unassigned[$name] = $student;
    }
}
/*assign unassigned student to free spots*/
foreach($unassigned as $name => $student){
    foreach($teachers as $teacherName => $listOfStudents){
        if(count($listOfStudents['students']) < 5 && count($listOfStudents['specializations']) < 2 && in_array($student[3],$teachers[$teacherName]['specializations'])){
            $teachers[$teacherName]['students'][] = $name." (none of prefered choices) (".$student[3].")";
        }
    }
}
print_r($teachers);

<?php
function shuffle_assoc($list) {
    if (!is_array($list)) return $list;
    $keys = array_keys($list);
    shuffle($keys);
    $random = array();
    foreach ($keys as $key) {
        $random[$key] = $list[$key];
    }
    return $random;
}
function searchForId($id, $array) {
    foreach ($array as $key => $val) {
        if ($val['specializations'] === $id) {
            return $key;
        }
    }
    return null;
 }
$preferencesOfStudents = [
    'students' => [
        'Stacy' => ['Mr Jobs','Mr Gates','Mr Musk', 'Biology', 'Usability'],
        'Carl' => ['Mr Jobs','Mr Gates','Mr Musk', 'Design', 'Physics'],
        'Melody' => ['Mr Bezos','Mr Musk','Mr Gates', 'Usability', 'Physics'],
        'William' => ['Mr Musk','Mr Gates','Mr Jobs', 'Computer Science', 'Usability'],
        'Eric' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics', 'Design'],
        'Charlott' => ['Mr Bezos','Mr Gates','Mr Musk', 'Geography', 'Design'],
        'Anthony' => ['Mr Gates','Mr Musk','Mr Jobs', 'Geography', 'Computer Science'],
        'Sarah' => ['Mr Bezos','Mr Jobs','Mr Musk', 'Design', 'Physics'],
        'Nelly' => ['Mr Gates','Mr Musk','Mr Jobs', 'Usability', 'Design'],
        'Connor' => ['Mr Gates','Mr Bezos','Mr Musk', 'Physics', 'Usability'],
        'Frodo' => ['Mr Gates','Mr Musk','Mr Jobs', 'Computer Science', 'Geography'],
        'Achmed' => ['Mr Gates','Mr Jobs','Mr Musk', 'Computer Science', 'Geography'],
        'Charlie' => ['Mr Bezos','Mr Musk','Mr Gates', 'Usability', 'Physics'],
        'India' => ['Mr Musk','Mr Gates','Mr Jobs', 'Computer Science', 'Usability'],
        'Lima' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics', 'Design'],
        'Mike' => ['Mr Jobs','Mr Gates','Mr Musk', 'Geography', 'Design'],
        'Oscar' => ['Mr Gates','Mr Musk','Mr Jobs', 'Usability', 'Computer Science'],
        'Quentin' => ['Mr Gates','Mr Jobs','Mr Musk', 'Design', 'Physics'],
        'Sam' => ['Mr Gates','Mr Musk','Mr Jobs', 'Usability', 'Design'],
        'Victor' => ['Mr Gates','Mr Jobs','Mr Musk', 'Physics', 'Usability'],
        'Zach' => ['Mr Gates','Mr Musk','Mr Jobs', 'Computer Science', 'Geography'],
        'Arya' => ['Mr Gates','Mr Jobs','Mr Musk', 'Computer Science', 'Geography']
    ]
];

$teachers = [
    'Mr Jobs' => [
        'students' => [],
        'specializations' => ['Biology', 'Design']
    ],
    'Mr Gates' => [
        'students' => [],
        'specializations' => ['Computer Science', 'Usability']
    ],
    'Mr Musk' => [
        'students' => [],
        'specializations' => ['Physics', 'Geography']
    ],
    'Mr Bezos' => [
        'students' => [],
        'specializations' => ['Usability', 'Biology']
    ]
];
$unassigned = [];
$randomStudentsArray = shuffle_assoc($preferencesOfStudents['students']);
/*assign students to prefered spots randomly*/
foreach($randomStudentsArray as $name => $student){
    if(count($teachers[$student[0]]['students']) < 5 && (in_array($student[3],$teachers[$student[0]]['specializations']) || in_array($student[3],$teachers[$student[0]]['specializations']))){   
        $teachers[$student[0]]['students'][] = $name." (first choice) (".$student[3].")";
    } elseif(count($teachers[$student[1]]['students']) < 5 && (in_array($student[3],$teachers[$student[1]]['specializations']) || in_array($student[3],$teachers[$student[0]]['specializations']))) {
        $teachers[$student[1]]['students'][] = $name." (second choice) (".$student[3].")";
    } elseif(count($teachers[$student[2]]['students']) < 5 && (in_array($student[3],$teachers[$student[2]]['specializations']) || in_array($student[3],$teachers[$student[0]]['specializations'])))  {
        $teachers[$student[2]]['students'][] = $name." (third choice) (".$student[3].")";
    } else {
        $unassigned[$name] = $student;
    }
}
/*assign unassigned student to free spots*/
foreach($unassigned as $name => $student){
    foreach($teachers as $teacherName => $listOfStudents){
        if(count($listOfStudents['students']) < 5 && count($listOfStudents['specializations']) < 2 && ( in_array($student[3],$teachers[$teacherName]['specializations']) || in_array($student[4],$teachers[$teacherName]['specializations']) )){
            $teachers[$teacherName]['students'][] = $name." (none of prefered choices) (".$student[3].")";
        }
    }
}
print_r($teachers);

这篇关于扩展阵列以增加其他要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆