首页 > 解决方案 > 提取数组条目以完美匹配案例

问题描述

我正在构建一个学生应用程序,我需要根据需要涵盖的学期数的文件找到最适合学生的文件。

每个学生都在上传一个文件,他们可以在其中选择所涵盖的多个学期。假设文件 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。

我正在提供文件,其中每个文件涵盖多个学期,如下所示:

以下文件中的学生文件:

需要涵盖的学期和预期结果:

预期结果:文件 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

标签: phparrays

解决方案


你可以这样做:

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

演示:https ://3v4l.org/ZfDLo

说明: 我创建了一个新数组并插入按最小值分组的值(数组排序后的第一个数字)。在该过程中,我确保只保留与您的输入(1-输入)和(第一个数字 - 最后一个数字)重叠最多的文件。现在我对分组数组进行排序,并进行迭代。我现在需要做的就是添加文件,直到达到给定输入的最大数量。


推荐阅读