3v4l.org

run code in 300+ PHP versions simultaneously
<?php $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], ]; function mergeDateRanges($p_arrDateranges) { $finalArray = []; $arrLastDR = null; foreach ($p_arrDateranges as $arrDR) { if ($arrLastDR === null) { $arrLastDR = $arrDR; continue; } $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']) { $arrLastDR['end_date'] = $arrDR['end_date']; }else{ array_push($finalArray, $arrLastDR); $arrLastDR = $arrDR; } } if($arrLastDR !== null){ array_push($finalArray, $arrLastDR); } return $finalArray; } print_r(mergeDateRanges($existingRanges));
Output for 8.1.0 - 8.1.28, 8.2.0 - 8.2.19, 8.3.0 - 8.3.7
Array ( [0] => Array ( [start_date] => 2023-11-22 [end_date] => 2023-11-30 [price] => 200 ) [1] => Array ( [start_date] => 2023-12-10 [end_date] => 2023-12-27 [price] => 100 ) [2] => Array ( [start_date] => 2024-01-05 [end_date] => 2024-01-05 [price] => 600 ) [3] => Array ( [start_date] => 2024-01-06 [end_date] => 2024-01-20 [price] => 700 ) [4] => Array ( [start_date] => 2024-01-21 [end_date] => 2024-01-31 [price] => 100 ) )

preferences:
94.38 ms | 403 KiB | 62 Q