提取数组条目以适合最合适的情况

时间:2018-11-02 10:22:10

标签: php arrays

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

每个学生都上传一个文件,他们在其中选择涵盖的多个学期。假设文件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,该文件完全涵盖了这种情况。

我提供的文件每个文件都涵盖多个学期,例如:

  

以下文件中的学生文件:

  • 文件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

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

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

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