2016-04-14 9 views
0

ich auf Laravel 5.2Laravel Zeitblocks aus gegebenem Zeitbereich entfernen

Gemäß der Projektanforderung arbeite, habe ich einen Zeitbereich, die 08:00 AM-08:00 PM starten.

d.h. array ("start"=> "08:00:00", "end" => "20:00:00");

Es gibt es mehrere Brüche, z.B. 01:00 PM-02:00 PM, 04:00 PM-04:30 PM, 06:35 PM-07:10 PM, 06:45 PM-07:15 PM usw.

dh

array(
["start" => "13:00:00", "end" => "14:00:00"], 
["start" => "16:00:00", "end" => "16:30:00"], 
["start" => "18:35:00", "end" => "19:10:00"], 
["start" => "18:45:00", "end" => "19:15:00"], 
); 

Nun möchte ich aus bestimmten Bereich alle diese Zeitblöcke von Pausen entfernen und das Ergebnis in einem Array wollen wie,

array (
["start" => "08:00 AM", "end" => "01:00 PM"], 
["start" => "01:00 PM", "end" => "04:00 PM"], 
["start" => "04:30 PM", "end" => "06:35 PM"], 
["start" => "07:15 PM", "end" => "08:00 PM"] 
) 

Mit PHP oder Laravel wie kann ich das erreichen?

+0

Sie wollen 24-Stunden-Format in 12 Stunden-Format konvertieren? –

+0

Es gibt kein spezielles Format für die Zeit, um Ihr Array zu konvertieren. Ab sofort enthält Ihr Array und Ihr erwartetes Array keine Ähnlichkeiten oder Bedingungen zum Arbeiten. –

Antwort

1

Ich hatte etwas Zeit in meinen Händen. Versuche dies.

function amPmToDateTime($ampm) 
{ 
    return DateTime::createFromFormat('Y-m-d h:i A', "1000-01-01 {$ampm}"); 
} 

function timeToDateTime($time) 
{ 
    return DateTime::createFromFormat('Y-m-d H:i:s', "1000-01-01 {$time}"); 
} 

function formatAmPm(DateTime $dateTime) 
{ 
    return $dateTime->format("h:i A"); 
} 

function formatTime(DateTime $dateTime) 
{ 
    return $dateTime->format("H:i:s"); 
} 

function intervalsCollide($i1, $i2) { 
    if(!(($i1[1] <= $i2[0] && $i1[1] < $i2[1]) || ($i1[0] > $i2[0] && $i1[0] >= $i2[1]))) { 
     return true; 
    } 
    return false; 
} 

function intervalMinusBreak($interval, $break) 
{ 
    $intervalParts = []; 

    if(intervalsCollide($interval, $break)) 
    { 
     if($interval[0] < $break[0] && $interval[1] > $break[1]) 
     { 
      $intervalParts[] = [ $interval[0], $break[0] ]; 
      $intervalParts[] = [ $break[1], $interval[1] ]; 
     } 
     else if($interval[0] < $break[0] && $interval[1] <= $break[1]) 
     { 
      $intervalParts[] = [ $interval[0], $break[0] ]; 
     } 
     else if($interval[0] >= $break[0] && $interval[1] > $break[1]) 
     { 
      $intervalParts[] = [ $break[1], $interval[1] ]; 
     } 
    } 
    else 
    { 
     $intervalParts[] = $interval; 
    } 

    return $intervalParts; 
} 

function intervalMinusBreaks($interval, $breaks) 
{ 
    $break = array_pop($breaks); 
    $parts = intervalMinusBreak($interval, $break); 

    if(count($breaks) < 1) 
    { 
     return $parts; 
    } 

    $intervalParts = []; 

    foreach($parts as $part) 
    { 
     $intervalParts = array_merge($intervalParts, intervalMinusBreaks($part, $breaks)); 
    } 

    return $intervalParts; 
} 

$interval = [ "start" => "08:00:00", "end" => "20:00:00" ]; 
$interval = [ timeToDateTime($interval['start']), timeToDateTime($interval['end']) ]; 


$breaks = [ 
    ["start" => "13:00:00", "end" => "14:00:00"], 
    ["start" => "16:00:00", "end" => "16:30:00"], 
    ["start" => "18:35:00", "end" => "19:10:00"], 
    ["start" => "18:45:00", "end" => "19:15:00"], 
]; 

$breaks = array_map(function($break) { 
    return [ timeToDateTime($break['start']), timeToDateTime($break['end']) ]; 
}, $breaks); 

$timeBlocks = intervalMinusBreaks($interval, $breaks); 

$timeBlocks = array_map(function($timeBlock) { 
    return [ 'start' => formatAmPm($timeBlock[0]), 'end' => formatAmPm($timeBlock[1]) ]; 
}, $timeBlocks); 

echo "<pre>"; 
print_r($timeBlocks); 
echo "</pre>"; 

Ergebnis:

Array 
(
    [0] => Array 
     (
      [start] => 08:00 AM 
      [end] => 01:00 PM 
     ) 

    [1] => Array 
     (
      [start] => 02:00 PM 
      [end] => 04:00 PM 
     ) 

    [2] => Array 
     (
      [start] => 04:30 PM 
      [end] => 06:35 PM 
     ) 

    [3] => Array 
     (
      [start] => 07:15 PM 
      [end] => 08:00 PM 
     ) 

) 
+0

Arbeitete wie ein Zauber. Danke vielmals. Es gibt einen Fehler im Variablennamen in der Methode intervalMinusBreak(), er sollte "Intervall" sein, nicht "Intervalle". Bitte aktualisiere es. – Dev

+0

Ich habe es behoben. – blablabla

Verwandte Themen