Ankündigung

Einklappen
Keine Ankündigung bisher.

Datumsbereich splitten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datumsbereich splitten

    Hallo zusammen,

    ich habe eine Frage zum Splitten von Datumsangaben.
    Angenommen, es ist ein Zeitraum gegeben, sagen wir in Form von
    PHP-Code:
    $basis = array( 'von' => '2015-01-01''bis' => '2015-01-31'); 
    Diese Zeitangabe soll nun anhand von beliebig vielen weiteren Datumsangaben gesplittet werden, z.B. in Form von
    PHP-Code:
    $slots = array( array(  'start' => '2015-01-01''end'  => '2015-01-03'),
                    array(  
    'start' => '2015-01-06''end'  => '2015-01-10')
    ); 
    Wenn ich alles auf eine Zeitachse runterbreche, erhält man die Gruppen:
    2015-01-
    01 bis 03 (slot 1), 04-05 (basis), 06-10 (slot 2) und 11-31 (wieder basis).

    Die Slots können allerdings verschachtelt vorliegen, liegen jedoch stets innerhalb der Basis (einschl. Grenzen).
    Hier eine grafische Darstellung mit verschachtelten Angaben (hoffentlich wirds überall korrekt dargestellt):
    Code:
    |---------------------------------------------------------| Basis
          |-------|                                             Slot
          |-------|                                             Slot
       |-------|                                                Slot
                    |-------|                                   Slot
                         |-|                                    Slot
                                          |-------|             Slot           
    
    Runterbrechen auf eine Achse:
    |--|--|----|--|-|----|-||-------------|-------|-----------|
    
    neue Grenzen:
    S-ES-ES----ES-EUS---ES-EUS-----------ES-------ES----------E   S..Start,E..Ende, U..Start=Ende
    Was ich nun bräuchte, sind die einzelnen Zeiträume. Klingt eigentlich einfach, aber mir fällt einfach kein richtiger Algorithmus dazu ein, so dass ich mich riesig freuen würde, wenn mir jemand bei der Umsetzung helfen könnte. Problematisch ist dabei, dass einige Zeiträume (rot markiert) erst generiert werden müssen. Dazu gilt:
    - fängt ein Slot an, kommt ein Tag zuvor ein Enddatum
    - hört ein Slot auf, kommt ein Tag danach ein Startdatum

    Welchen Ansatz könnte man hier anwenden? Bin leider total ratlos wann hier die neuen (roten) Element erstellt werden müssten (außer eben zu sagen "wenn sie nicht existieren". Wie würde man das programmatisch angehen?
    Über jegliche Hilfe und/oder Anregungen würde ich mich sehr freuen!

    Viele Grüße
    Roman


  • #2
    Naja, so hab ich es doch selber gelöst. War vielleicht ne gute Motivation, das ganze hier mal aufzuschreiben
    PHP-Code:
    $basis = array( 'von' => '2015-01-01',
                    
    'bis' => '2015-01-31');

    $slots = array( array(  'start' => '2015-01-01',
                            
    'end'   => '2015-01-03'),
                    array(  
    'start' => '2015-01-06',
                            
    'end'   => '2015-01-10'),
                    array(  
    'start' => '2015-01-06',
                            
    'end'   => '2015-01-10'),
                    array(  
    'start' => '2015-01-09',
                            
    'end'   => '2015-01-17'),
                    array(  
    'start' => '2015-01-03',
                            
    'end'   => '2015-01-18'),
                    array(  
    'start' => '2015-01-22',
                            
    'end'   => '2015-01-23'),

    );

    $startdates = array($basis['von']);
    $enddates = array($basis['bis']);

    foreach (
    $slots as $slot) {
        
    $startdates[] = $start $slot['start'];
        
    $enddates[] = $end $slot['end'];
        
    $endsucc date('Y-m-d'strtotime($end '+1 day'));
        
    $startpred date('Y-m-d'strtotime($start '-1 day'));

        if (
    $endsucc $basis['bis']) {
            
    $startdates[] = $endsucc;
        } 

        if (
    $startpred $basis['von']) {
            
    $enddates[] = $startpred;
        } 
    }

    $startdates array_unique($startdates);
    $enddates array_unique($enddates);

    sort($startdates);
    sort($enddates);

    if (
    count($startdates) != count($enddates)) {
        die(
    'Das sollte nicht sein!');
    }

    $final = array();
    foreach (
    $startdates as $k => $v) {
        
    $dayset = array('start' => $v'end' => $enddates[$k]);
        
    $final[] = $dayset;

    Output:
    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    start] => 2015-01-01
                
    [end] => 2015-01-02
            
    )

        [
    1] => Array
            (
                [
    start] => 2015-01-03
                
    [end] => 2015-01-03
            
    )

        [
    2] => Array
            (
                [
    start] => 2015-01-04
                
    [end] => 2015-01-05
            
    )

        [
    3] => Array
            (
                [
    start] => 2015-01-06
                
    [end] => 2015-01-08
            
    )

        [
    4] => Array
            (
                [
    start] => 2015-01-09
                
    [end] => 2015-01-10
            
    )

        [
    5] => Array
            (
                [
    start] => 2015-01-11
                
    [end] => 2015-01-17
            
    )

        [
    6] => Array
            (
                [
    start] => 2015-01-18
                
    [end] => 2015-01-18
            
    )

        [
    7] => Array
            (
                [
    start] => 2015-01-19
                
    [end] => 2015-01-21
            
    )

        [
    8] => Array
            (
                [
    start] => 2015-01-22
                
    [end] => 2015-01-23
            
    )

        [
    9] => Array
            (
                [
    start] => 2015-01-24
                
    [end] => 2015-01-31
            
    )


    Kommentar

    Lädt...
    X