Php 通过附加要求扩展阵列
我对PHP还不熟悉,但我已经尽力了。请对我耐心点。:) 昨天我已经问了一个类似的问题,但今天我必须扩展它 初始情况 在我的学校,毕业生必须在最后一年为论文选择一个主题。每个学生从一个学科领域中选择一位导师来帮助他们 起始位置Php 通过附加要求扩展阵列,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我对PHP还不熟悉,但我已经尽力了。请对我耐心点。:) 昨天我已经问了一个类似的问题,但今天我必须扩展它 初始情况 在我的学校,毕业生必须在最后一年为论文选择一个主题。每个学生从一个学科领域中选择一位导师来帮助他们 起始位置 每个学生必须指定三个愿望,并按顺序排列 偏好的降序。例子:斯泰西选择了乔布斯先生 设计作为她的第一个愿望,卡尔也选择乔布斯先生作为他的第一个愿望 希望,但在可用性方面。威廉选择盖茨先生攻读计算机科学 作为他的第一选择,夏洛特选择了生物学领域的盖茨先生作为他的第一选择 第一
- 每个学生必须指定三个愿望,并按顺序排列 偏好的降序。例子:斯泰西选择了乔布斯先生 设计作为她的第一个愿望,卡尔也选择乔布斯先生作为他的第一个愿望 希望,但在可用性方面。威廉选择盖茨先生攻读计算机科学 作为他的第一选择,夏洛特选择了生物学领域的盖茨先生作为他的第一选择 第一选择
- 每位导师最多可指导三名学生
- 每位教师最多可选择两门课程。所以乔布斯可以 在设计和可用性方面被选中,盖茨先生在计算机科学和技术领域 生物学,马斯克先生主修物理和地理
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)
最后的问题
- 我怎样才能确保尽可能多的学生获得第一名呢 希望在剩下的学生中,应尽可能多地获得 第二个愿望,其余的是第三个愿望。(完成了吗?你有提普吗?)
- 如何扩展下面的脚本,使不同的主题 考虑到了我的同事,但没有人监督得更多 超过3个学生
- 如何告诉脚本也输出赋值是否正确 第一个愿望,第二个愿望还是第三个愿望
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);
function shuffle\u assoc($list){
如果(!is_数组($list))返回$list;
$keys=数组_键($list);
洗牌($键);
$random=array();
foreach($key作为$key){
$random[$key]=$list[$key];
}
返回$random;
}
$preferencesOfStudents=[
“学生”=>[
“Stacy”=>[“乔布斯先生”、“盖茨先生”、“马斯克先生”],
“卡尔”=>[“乔布斯先生”、“盖茨先生”、“马斯克先生”],
“Melody”=>[“乔布斯先生”、“马斯克先生”、“盖茨先生”],
“威廉”=>[“马斯克先生”、“盖茨先生”、“乔布斯先生”],
“埃里克”=>[“盖茨先生”、“乔布斯先生”、“马斯克先生”],
“夏洛特”=>[“乔布斯先生”、“盖茨先生”、“马斯克先生”],
“安东尼”=>[“盖茨先生”、“马斯克先生”、“乔布斯先生”],
“莎拉”=>[“盖茨先生”、“乔布斯先生”、“马斯克先生”],
“耐莉”=>[“盖茨先生”、“马斯克先生”、“乔布斯先生”]
]
];
//1=工作,2=门,3=麝香
$教师=[
“乔布斯先生”=>[],
“盖茨先生”=>[],
“马斯克先生”=>[]
];
$randomStudentsArray=shuffle_assoc($preferencesOfStudents['students');
//打印(randomStudentsArray);
foreach($randomStudentsArray作为$name=>$student){
如果(计数($teachers[$student[0]])<3){
$teachers[$student[0]][]=$name;
}其他(计数($teachers[$student[1]])<3){
$teachers[$student[1]][]=$name;
}否则{
$teachers[$student[2]][]=$name;
}
}
印刷(教师);
编辑:这样行吗?希望对大家有所帮助
但是,如果最多有两个专业,则存在一个问题:有时并非所有学生都可以分配
但是is尽其所能地尝试,并且是随机的,所以如果它不能提供良好的输出,请再试一次
<?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);
今晚下班后去看看!非常感谢你!请尝试一下,我将帮助你学习科目部分,请再解释一下:)关于科目:老师每年可能有两门课。尽管如此,他/她最多可以装载5篇论文。这个解释更好吗?所以每个学生都选了一个科目?那么一个老师最多可以做两门课?但是你说5篇论文是什么意思呢?)每个学生必须在一个科目上写一篇论文。一名教师一年最多可以上两门课。教师最多可指导五篇论文。事实上,他/她可能有两门课程,但这并不意味着他/她可以指导的论文的最大数量增加到10篇。我稍后会尝试为你这样做!
<?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);