php - 提取数组条目以完美匹配案例
问题描述
我正在构建一个学生应用程序,我需要根据需要涵盖的学期数的文件找到最适合学生的文件。
每个学生都在上传一个文件,他们可以在其中选择所涵盖的多个学期。假设文件 X 有第 1 学期和第 2 学期,文件 Y 有第 1、3、4 学期等等。
这里唯一的顺序是升序。所选学期的数量可以是随机的(1 或 1,2,3 或 3,4 或 2,5,6 或 1,2,5,6,8 或此类的任何组合)。
我需要实现的是在考虑到要覆盖的较小学期的情况下获得最少数量的文件,覆盖最多的学期。
在我的示例中,需要第 5 学期的特殊情况,我可以返回文件 1、2、3、4,因为所有这些都包含要涵盖的学期,但这不是我想要的。相反,我需要获得完美涵盖这种情况的文件 3 和 4。
我正在提供文件,其中每个文件涵盖多个学期,如下所示:
以下文件中的学生文件:
- 文件 1 涵盖学期:
array(3)
- 文件 2 涵盖学期:
array(3,4)
- 文件 3 涵盖学期:
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 ] ] ];
需要涵盖的学期和预期结果:
- 选项 1:所需学期数:5。
预期结果:文件 3,文件 4
$aResult = [
0 => [
'file' => 'file 3',
'semesters' => [
1,2
]
],
1 => [
'file' => 'file 4',
'semesters' => [
3,4,5,6
]
]
];
- 选项 2:所需学期数:2。
预期结果:文件 3
$aResult = [
0 => [
'file' => 'file 3',
'semesters' => [
1,2
]
]
];
- 选项 3:所需学期数:4。
预期结果:文件 3,文件 2
- 选项 4:所需学期数:3。
预期结果:文件 3,文件 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-输入)和(第一个数字 - 最后一个数字)重叠最多的文件。现在我对分组数组进行排序,并进行迭代。我现在需要做的就是添加文件,直到达到给定输入的最大数量。
推荐阅读
- c# - 我无法在 Visual Studio 上运行正确的查询
- c - 如何将矩阵发送到线程函数?
- python - AttributeError:'list' 对象没有属性'click' - 关注按钮 Instagram Selenium Python
- reactjs - 如何在发布请求中发送多个表单输入
- asp.net-mvc-4 - 如何将应用程序会话保持在同一域上?
- javascript - 如何在组件中接收先前发送到 redux 存储的值。(始终未定义)
- java - 如何将二维字符数组转换为字符串数组
- excel - 错误 - 无法在中断模式下执行 - VBA
- python - 需要许多输入的类函数的清洁代码模式
- javascript - 我对 ExtJs 控制器和查看按钮事件有疑问