0

Laravel 版本:7.0

我想知道如何创建这个助手。

输入是日期范围数组。例如:

$input1 = [2020-07-19, 2020-07-25];
$input2 = [2020-07-26, 2020-08-01];
$input3 = [2020-08-01, 2020-08-07];
$input4 = [2020-10-01, 2020-10-07];
$input5 = [2020-10-19, 2020-10-25];

我想做一个辅助函数。

function mergeDate($array)
{
   ...
}

所以当我使用这个助手时,我想得到以下结果。

$array = [$input1, $input2, $input3, $input4, $input5];
$mergedResult = mergeDate($array);

$mergedResult[0] = [2020-07-19, 2020-08-07];
$mergedResult[1] = [2020-10-01, 2020-10-07];
$mergedResult[2] = [2020-10-19, 2020-10-25];

谁能帮我实现mergeDate功能?

输入周期元素不重叠。

谢谢!

4

1 回答 1

1

这将是我第一次猜测如何解决它。

    public function merge($array){
        $results = [];
        foreach ($array as $element){
            if (sizeof($results) == 0){
                array_push($results,$element);
            }else{
                $found = null;
                foreach ($results as $key => $r){
                    if (Carbon::parse($element[0])->equalTo(Carbon::parse($r[1]))) 
                    {
                        $found = $key;
                        break;
                    }
                }
                if (!is_null($found)){
                    $results[$found][1] = $element[1];
                }else{
                    array_push($results, $element);
                }
            }
        }
        return $results;
    }

这是一个简单的问题。如果我们的结果数组为空,我们添加第一个元素,否则我们迭代结果以在结果数组中找到匹配的元素结束日期和项目的开始日期。如果我们找到匹配的开始结束对,我们将结果结束值替换为元素结束值。否则我们没有重叠,我们可以将它作为一个新项目添加到结果数组中。

一个有趣的库是 Spatie/Period 库。 https://github.com/spatie/period

@edit 因为数组没有像上面评论中提到的那样排序,所以你必须事先对其进行排序。

于 2020-07-29T15:14:42.443 回答