我正在构建一个学生应用程序,在该应用程序中,我需要根据具有所需学期数的文件,找到最适合学生的文件。
每个学生都上传一个文件,他们在其中选择涵盖的多个学期。假设文件X的第1学期为第2学期,文件Y的第1学期为第3、4、4学期,依此类推。
这里唯一的顺序是升序。所选的学期数可以是随机的(1或1,2,3或3,4或2,5,6或1,2,5,6,8或此类的任意组合)。
我需要实现的是,在考虑到要覆盖的较小学期的情况下,获取最少的文件覆盖最大的学期。
在我的示例中,第5个学期需要一个特殊情况,我可以返回文件1、2、3、4,因为所有这些都包含要覆盖的学期,但这不是我想要的。取而代之的是,我需要获取文件3和文件4,该文件完全涵盖了这种情况。
我提供的文件每个文件都涵盖多个学期,例如:
以下文件中的学生文件:
array(3)
array(3,4)
array(1,2)
文件4个学期:array(3,4,5,6)
$aUserFiles = [
0 => [
'file' => 'file 1',
'semesters' => [
3
]
],
1 => [
'file' => 'file 2',
'semesters' => [
3,4
]
],
2 => [
'file' => 'file 3',
'semesters' => [
1,2
]
],
3 => [
'file' => 'file 4',
'semesters' => [
3,4,5,6
]
]
];
需要涵盖的学期和预期结果:
预期结果:文件3,文件4
$aResult = [
0 => [
'file' => 'file 3',
'semesters' => [
1,2
]
],
1 => [
'file' => 'file 4',
'semesters' => [
3,4,5,6
]
]
];
预期结果:文件3
$aResult = [
0 => [
'file' => 'file 3',
'semesters' => [
1,2
]
]
];
预期结果:文件3,文件2
预期结果:文件3,文件1
答案 0 :(得分:1)
您可以执行以下操作:
$requiredSemesters = 3; // Your input
$indicators = [];
$result = [];
foreach ($aUserFiles as $key => $file) {
$first = $file['semesters'][0];
$last = $file['semesters'][count($file['semesters']) - 1];
$filesInRangeCount = count(array_intersect($file['semesters'], range(1, $requiredSemesters)));
if (!isset($indicators[$first]) || $indicators[$first]['range'] < $filesInRangeCount) {
$indicators[$first] = ["key" => $key, "max" => $last, "range" => $filesInRangeCount];
}
}
ksort($indicators);
$result = [];
$max = 0;
foreach ($indicators as $indicator) {
if ($max >= $requiredSemesters) {
break;
}
$result[] = $aUserFiles[$indicator['key']];
$max = $indicator["max"];
}
print_r($result);
说明: 我创建一个新数组,然后插入按最小值分组的值(第一个数字,因为数组是有序的)。在此过程中,我确保仅保留与输入(1-输入)和(第一个数字-最后一个数字)重叠数量最高的文件。现在,我对分组数组进行排序,然后进行迭代。我现在要做的就是添加文件,直到达到给定输入的最大数量为止。