Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过附加要求扩展阵列_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 通过附加要求扩展阵列

Php 通过附加要求扩展阵列,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我对PHP还不熟悉,但我已经尽力了。请对我耐心点。:) 昨天我已经问了一个类似的问题,但今天我必须扩展它 初始情况 在我的学校,毕业生必须在最后一年为论文选择一个主题。每个学生从一个学科领域中选择一位导师来帮助他们 起始位置 每个学生必须指定三个愿望,并按顺序排列 偏好的降序。例子:斯泰西选择了乔布斯先生 设计作为她的第一个愿望,卡尔也选择乔布斯先生作为他的第一个愿望 希望,但在可用性方面。威廉选择盖茨先生攻读计算机科学 作为他的第一选择,夏洛特选择了生物学领域的盖茨先生作为他的第一选择 第一

我对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个学生
  • 如何告诉脚本也输出赋值是否正确 第一个愿望,第二个愿望还是第三个愿望
用户Rustyjim昨天帮我编写了以下脚本。再次感谢

祝你身体健康

到目前为止的脚本

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