扩展阵列以增加其他要求 [英] Extend array with additional requirements
问题描述
我是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屋!