我有一个数组,它有开始日期,结束日期和价格,例如.
/* date formate 'yyyy-mm-dd' */
$existingRanges = [
['start_date' => '2023-11-22', 'end_date' => '2023-11-30', 'price' => 200],
['start_date' => '2023-12-10', 'end_date' => '2023-12-14', 'price' => 100],
['start_date' => '2023-12-15', 'end_date' => '2023-12-20', 'price' => 100],
['start_date' => '2023-12-21', 'end_date' => '2023-12-27', 'price' => 100],
['start_date' => '2024-01-05', 'end_date' => '2024-01-05', 'price' => 600],
['start_date' => '2024-01-06', 'end_date' => '2024-01-07', 'price' => 700],
['start_date' => '2024-01-08', 'end_date' => '2024-01-20', 'price' => 700],
['start_date' => '2024-01-21', 'end_date' => '2024-01-31', 'price' => 100],
];
我想在这里合并所有的日期是相邻的,但有相同的价格,即100到101和102到103这两个日期范围是相邻的,他们的价格是一样的,所以它应该是100到103和价格700.
我的结果数组示例.
$results = [
['start_date' => '2023-11-22', 'end_date' => '2023-11-30', 'price' => 200],
['start_date' => '2023-12-10', 'end_date' => '2023-12-27', 'price' => 100],
['start_date' => '2024-01-05', 'end_date' => '2024-01-05', 'price' => 600],
['start_date' => '2024-01-06', 'end_date' => '2024-01-20', 'price' => 700],
['start_date' => '2024-01-21', 'end_date' => '2024-01-31', 'price' => 100],
];
我try 的代码/逻辑
function mergeDateRanges($p_arrDateranges) {
// sort by start date
/* usort($p_arrDateranges, function($a1, $a2) {
return $a1['start_date'] === $a2['start_date'] ? 0 : ($a1['start_date'] < $a2['start_date'] ? -1 : 1);
}); */
$finalArray = [];
$arrMerged = array();
$arrLastDR = null;
foreach ($p_arrDateranges as $arrDR) {
if ($arrLastDR === null) {
$arrLastDR = $arrDR;
continue;
}
if(!$arrMerged) {
array_push($arrMerged, $arrLastDR);
}
$endDate = DateTime::createFromFormat('Y-m-d', $arrLastDR['end_date']);
$sLastDateE_1 = $endDate->modify('+1 day')->format('Y-m-d');
if (strtotime($arrDR['start_date']) < strtotime($sLastDateE_1) && $arrDR['price'] == $arrLastDR['price']) {
array_push($finalArray, [
'start_date' => $arrDR['start_date'],
'end_date' => $arrLastDR['end_date'],
'price' => 0
]);
} else {
array_push($finalArray, $arrDR);
}
$arrLastDR = $arrDR;
array_push($arrMerged, $arrLastDR);
//print_r($arrLastDR);
}
return $finalArray;
}
mergeDateRanges($existingRanges);
这是返回不同的结果,所以请帮助我解决这个问题.