Bernd: Darstellung/ Ausgabe von weiteren Einträge abhängig machen

Moin,

ich habe folgende Funktion und die dazugehörige Ausgabe

function MitarbeiterKalenderTagesansicht($mysqli, $datum, $user) {
    
        $stmt = $mysqli->prepare("

            SELECT kt_id, kt_kalenderID, kt_datum, k_ganztags, k_von, k_bis, kp_userID
            FROM kalender_termine 

            LEFT JOIN kalender ON kalender.k_code = kalender_termine.kt_kalenderID
            LEFT JOIN kalender_personal ON kalender_personal.kp_code = kalender_termine.kt_kalenderID
            
            WHERE kt_datum=? AND kp_userID=?");
       
        $stmt->bind_param("ss", $datum, $user);
        $stmt->execute();
        $stmt->bind_result($kt_id, $kt_kalenderID, $kt_datum, $k_ganztags, $k_von, $k_bis, $kp_userID);
        $stmt->store_result();
        
        if($stmt->num_rows() >  0) {     
            
            while ($stmt->fetch()){
                
                $MitarbeiterKalenderTagesansicht[] = array( 
                    
                    'kt_id'          => $kt_id,
                    'kt_kalenderID'  => $kt_kalenderID,
                    'kt_datum'       => $kt_datum,
                    'k_ganztags'     => $k_ganztags,
                    'k_von'          => $k_von,
                    'k_bis'          => $k_bis,
                    'kp_userID'      => $kp_userID
                
                );
            }
            return $MitarbeiterKalenderTagesansicht;
            }
    }
<?php foreach($UserAktiv as $arrayUserAktiv){

$MitarbeiterKalenderTagesansicht = MitarbeiterKalenderTagesansicht($mysqli, $_GET['date'], $arrayMitarbeiterLager['userid']);
        foreach($MitarbeiterKalenderTagesansicht as $arrayKalenderTagesansicht){ ?>
            <?php echo $arrayKalenderTagesansicht['k_von'] . " - " . $arrayKalenderTagesansicht['k_bis'];?><br>
        <?php } ?> 

?>
    
<div><?php echo $arrayUserAktiv['per_vorname'] . " " . $arrayUserAktiv['per_name'] ; ?></div>
<div>

<?php   
if ($wochentage[date("w", $zeit)] == "montag") { 
    
    if ($arrayUserAktiv['mo_von'] != "") {
         echo $arrayUserAktiv['mo_von'] . " Uhr bis " . $arrayUserAktiv['mo_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>

<?php   
if ($wochentage[date("w", $zeit)] == "dienstag") { 

    if ($arrayUserAktiv['di_von'] != "") {
         echo $arrayUserAktiv['di_von'] . " Uhr bis " . $arrayUserAktiv['di_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>

<?php  
if ($wochentage[date("w", $zeit)] == "mittwoch") { 

    if ($arrayUserAktiv['mi_von'] != "") {
        echo $arrayUserAktiv['mi_von'] . " Uhr bis " . $arrayUserAktiv['mi_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>

<?php   
if ($wochentage[date("w", $zeit)] == "donnerstag") { 

    if ($arrayUserAktiv['do_von'] != "") {
        echo $arrayUserAktiv['do_von'] . " Uhr bis " . $arrayUserAktiv['do_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>

<?php   
if ($wochentage[date("w", $zeit)] == "freitag") { 

    if ($arrayUserAktiv['fr_von'] != "") {
        echo $arrayUserAktiv['fr_von'] . " Uhr bis " . $arrayUserAktiv['fr_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>

<?php   
if ($wochentage[date("w", $zeit)] == "samstag") { 
    
    if ($arrayUserAktiv['sa_von'] != "") {
        echo $arrayUserAktiv['sa_von'] . " Uhr bis " . $arrayUserAktiv['sa_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>

<?php   
if ($wochentage[date("w", $zeit)] == "sonntag") { 
    
    if ($arrayUserAktiv['so_von'] != "") {
        echo $arrayUserAktiv['so_von'] . " Uhr bis " . $arrayUserAktiv['so_bis'] . " Uhr";
    } else { echo "nach Bedarf"; }

}
?>
</div>

<?php } ?>

Das ganze sieht dann so aus

Die Ausgabe stimmt also, Weg und die dazugehörigen Zeiten sind nur Test Ausgaben, die sind später nicht mehr sichtbar.

Jetzt kommt das schwere wo ich überhaupt kein Plan habe, wie ich es umsetzten soll. Beim ersten Eintrag hat der User zwischen 11:30 Uhr bis 17:30 Uhr Zeit. Jetzt ist er zwischen 09:30 - 12:30 verplant. Die Anzeige müsste wie wie folgt aussehen

  • 12:30 Uhr bis 17:30

Beim zweiten User wird es noch viel interessanter, dieser ist zwischen 09:00 Uhr bis 17:30 Uhr verfügbar, ist aber zwischen 06:30 - 08:00 & 16:30 - 18:00 verplant, also dürfte er nur von 09:00 Uhr bis 16:30 angezeigt werden.

Jetzt nehmen wir mal einen weiteren Fall. User drei ist von 08:00 - 20:00 Uhr da. Folgende Termine hat er 08:45 - 10:00 & 12:00 - 14:00 & 15:00 - 17:00 Uhr. Dann müsste dieser wie folgt angezeigt werden:

  • 08:00 bis 08:45 Uhr
  • 10:00 bis 12:00 Uhr
  • 14:00 bis 15:00 Uhr
  • 17:00 bis 20:00 Uhr

Wie kann ich eine solche Darstellung realisieren oder ist dieses unmöglich?

  1. Hallo Bernd,

    natürlich ist das möglich.

    Du hast zwei Eingaben:

    • Die verfügbaren Zeiten des Mitarbeiters. Das ist ein Array aus Zeitintervallen (wenn's keine Termine gibt, ist das ein Eintrag, oder vielleicht auch mehr, der MA könnte ja geplant von 9-12 und 18-21 Uhr da sein).
    • Verplante Zeiträume des Mitarbeiters, ein Array mit 0-N Zeitintervallen.

    Für den Fall "nach Bedarf" brauchst Du einen Sonderfall, wenn jemand bedarfsweise da ist, dann bleibt das wohl bedarfsweise, egal wie viele Termine schon sind, oder?

    Wie dein Beispiel 1 zeigt, ist es durchaus möglich, dass ein verplanter Zeitraum übe die reguläre Anwesenheitszeit hinausgeht. Macht aber nichts.

    Man sollte erwarten, dass die verplanten Zeiträume des Mitarbeiters sich nicht überschneiden. Aber selbst wenn - egal, das ist das gleiche Problem wie ein Termin, der vor Arbeitsbeginn beginnt.

    Du gehst nun die verplanten Zeiträume (Termine) des MA durch. Pro Termin gehst Du das Array mit Verfügbaren Zeiträumen durch und prüfst, ob der Termin den verfügbaren Zeitraum überschneidet:

    Erstmal eine Art Pseudo-PHP Code:

    foreach ($termine as $termin) {
       foreach ($verfuegbareZeiten as $verfuegbar) {
          if (/* $termin überschneidet $verfuegbar */) {
             /* manipulieren */
          }
       }
    }
    

    Ein Zeitraum ist ein Tupel aus Anfang und Endezeitpunkt (dafür bieten sich Objekte an, willst Du da einsteigen? Die Alternative ist ein Array mit zwei Einträgen. z.B.
    [ 'von' => '11:30', 'bis' => '12:30' ]).

    Wann überschneiden sich zwei Zeiträume z1, z2? Die einfachere Frage ist, wann sie sich nicht überschneiden. Nämlich: Wenn das Ende des einen vor dem Anfang des anderen liegt (oder Ende und Anfang gleich sind). Also: Wenn z1.bis <= z2.von ODER z2.bis <= z1.von. Diese Abfrage invertieren wir im if und sind fertig.

    Würde man mit Objekten programmieren, sähe die Abfrage so aus:

    if ($z1->ueberschneidet($z2)) {
       // manipulieren
    }
    

    Ja, tatsächlich. Sowas würde man als Methode der Zeitintervall-Klasse bauen und schön sprechend formulieren:

    class Zeitintervall
    {
       public $von;
       public $bis;
    
       public function beginnt_vor($z2) {
          return $this->von <= $z2->von;
       }
    
       public function endet_nach($z2) {
          return $this->bis >= $z2->bis;
       }
    
       public function endet_vor($z2) {
          return $this->bis <= $z2->von;
       }
    
       public function ueberschneidet($z2) {
          return !($this->endet_vor($z2) || $z2->endet_vor($this));
       }
    }
    

    Mit Arrays könnte man die Abfrage am Ort und Stelle formulieren:

    if (!($z1['bis'] <= $z2['von'] || $z2['bis'] <= $z2['von']))
       // manipulieren
    }
    

    Oder es mit einer Helper-Funktion lesbarer machen:

    if (!(endet_vor($z1, $z2) || liegt_vor($z2, $z1)))
       // manipulieren
    }// anderswo
    function endet_vor($z1, z2) {
       return $z1['bis'] <= $z2['von'];
    }
    

    Das Thema "Manipulieren" ist schon etwas schwieriger. Ein Termin kann mit einem verfügbaren Zeitraum 5 Dinge tun:

    • gar nichts (wenn sie sich nicht überschneiden)
    • vom Anfang etwas wegschneiden ('von' wird größer)
    • vom Ende etwas wegschneiden ('bis' wird kleiner)
    • eliminieren (komplette überlappung)
    • teilen (liegt mitten drin)

    Wegschneiden ist noch harmlos, weil du dann nur einen bestehenden Eintrag der verfügbaren Zeiten abändern musst. Eliminieren und Teilen würde das iterierte Array verändern, und sowas ist immer sehr tricky. Die sicherste Lösung ist, die verfügbaren Zeiten pro Durchlauf in ein temporäres Array umzukopieren, und danach das temporäre Array als verfügbare Zeiten zu verwenden.

    Der Code verwendet die Zeitintervall-Klasse. Wenn Du lieber kleine Arrays für die Intervalle verwenden willst, dann mach es ähnlich wie oben und übersetze die Methoden der Klasse in Helper-Funktionen. Oder baue die jeweilige Logik direkt an Ort und Stelle ein.

    foreach ($termine as $termin)
    {
       $tempVerfuerbar = ARRAY();
       foreach ($verfuegbareZeiten as $verfuegbar)
       {
          if ($termin->ueberschneidet($verfuegbar))
          {
              if ($termin->beginnt_vor($verfuegbar))
              {
                 if ($termin->endet_nach($verfuegbar))
                 {
                    $verfuegbar = null;
                 }
                 else
                 {
                    // Verfügbare Zeit am Anfang verringern
                    $verfuegbar->von = $termin->bis;
                 }
              }
              else if ($verfuegbar->beginnt_vor($termin)
              {
                 if ($verfuegbar->endet_vor($termin)
                 {
                    // Termin liegt mitten drin. Vorderes Fragment ins tempArray legen
                    array_push($tempVerfuegbar, new Zeitraum($verfuegbar->von, $termin_von));
                    // $verfuegbar wird zum hinteren Fragment.
                    $verfuegbar->von = $termin->bis;
                 } 
                 else {
                    // Verfügbare Zeit am Ende verringern
                    $verfuegbar->bis= $termin->von;
                 }
              }
          }
          if ($verfuegbar) 
          {
             // $verfuegbar-Zeitraum an Temparray anhängen, sofern er nicht gelöscht wurde.
             array_push($tempVerfuegbar, $verfuegbar);
          }
       }
       $verfuegbareZeiten = $tempVerfuegbar;
    }
    

    Statt mit Objekten kannst Du das auch alles mit Arrays realisieren, es ist dann nur schwerer lesbar.

    Das ist so grob die Idee. Anwenden auf deinen Fall kannst Du sie sicher selbst.

    Zu deiner fetten if (wochentag[date....]) Logik würde ich Dir folgende Variante empfehlen (funktioniert ab PHP 5.5, vorher brauchst Du eine Extravariable für das Array mit den Kürzeln):

    <?php   
       $w_prefix = ARRAY('so', 'mo', 'di', 'mi', 'do', 'fr', 'sa')[date("w", $zeit)];
       $von = $arrayUserAktiv["{$w_prefix}_von"];
       $bis = $arrayUserAktiv["{$w_prefix}_bis"];
    
       if ($von != "")
       {
          echo "$von Uhr bis $bis Uhr";
       }
       else
       {
          echo "nach Bedarf";
       }
    
       // oder statt if:
       echo $von == "" ? "nach Bedarf" : "$von Uhr bis $bis Uhr";
    ?>
    

    In der ?: Version sind es dann 4 Zeilen, statt 56.

    Aus $von und $nach baust Du, für die Verfügbarkeitssuche, deinen initialen Verfügbarkeitszeitraum auf und führst dann die von mir skizzierte Logik durch. Das ist jetzt keine fertige Lösung, und ich bin auch nicht sicher, dass es tippfehlerfrei ist. Es ist wie üblich VHIG[1]-Code und der neigt nun mal dazu, kleinere Korrekturen zu brauchen. Aber das Prinzip sollte jetzt klar sein. Viel Glück 😉

    --
    sumpsi - posui - clusi

    1. Vom Hirn Ins Gerät Rolf ↩︎

    1. Hallo,

      vielen lieben Dank für deine mega ausführliche Erklärung. Leider scheint mir diese doch sehr kompliziert zu sein. Ich denke, ich bekomme dieses so nicht umgesetzt. Sehr schade, ich dacht es gibt eine einfachere Möglichkeit.

      Für den Fall "nach Bedarf" brauchst Du einen Sonderfall, wenn jemand bedarfsweise da ist, dann bleibt das wohl bedarfsweise, egal wie viele Termine schon sind, oder?

      Dieses ist wirklich ein Sonderfall und sollte auch nicht oft vorkommen. In diesem Fall sollte gar nichts passieren und nach Bedarf einfach stehen bleiben.

      Wie dein Beispiel 1 zeigt, ist es durchaus möglich, dass ein verplanter Zeitraum übe die reguläre Anwesenheitszeit hinausgeht. Macht aber nichts.

      Das sind keine reine Arbeitszeiten, in dieser Zeit würde mir dieser User / Mitarbeiter einfach zur Verfügung stehen, es sind alles freiberufliche Menschen, die können arbeiten wann und wie lange sie wollen. Nur in dieser Zeit sind diese geblockt.

      .... der MA könnte ja geplant von 9-12 und 18-21 Uhr da sein)

      In meinem Fall nicht. Es gibt immer nur ein von - bis pro Tag. Daher kann man diesen Fall derzeit ausschließen.

      Man sollte erwarten, dass die verplanten Zeiträume des Mitarbeiters sich nicht überschneiden.

      Die können sich überschneiden was aber für die Darstellung egal sein sollte, denn er ist ja eh vom vorherigen Termin noch nicht da. Überscheiden können sich z.B. Termine wenn es eine Abholung gibt die von 10:00 - 14:00 Uhr geht, in dieser Zeit z.B. noch ein Aufbau am gleichen Ort von 12:30 - 13:00 Uhr gibt. In diesem Fall würden sich beide Termine überlappen aber vom ersten in diesem Fall den längeren abgedeckt ist. Wenn der zweite Termin von 12:30 Uhr - 16:00 Uhr gehen würde, dann wäre der Start Termin 1, und das Ende von Termin 2. Aber in der Regel passiert dieses nicht.

      <?php   
         $w_prefix = ARRAY('so', 'mo', 'di', 'mi', 'do', 'fr', 'sa')[date("w", $zeit)];
         $von = $arrayUserAktiv["{$w_prefix}_von"];
         $bis = $arrayUserAktiv["{$w_prefix}_bis"];
      
         if ($von != "")
         {
            echo "$von Uhr bis $bis Uhr";
         }
         else
         {
            echo "nach Bedarf";
         }
      
         // oder statt if:
         echo $von == "" ? "nach Bedarf" : "$von Uhr bis $bis Uhr";
      ?>
      

      Wow, so viel kurzer und es funktioniert. Wahnsinn was alles möglich ist. Was ich nicht verstehe ist {$w_prefix}_von, was machen die {} Klammern und warum _von mein Feld heißt doch eigentlich komplett anderes.

      1. Hallo Bernd,

        leider ist ein Algorithmus zum Finden von freien Zeiten nicht ganz so einfach. Wenn man Intervalle zu einander in Beziehung setzen muss, gibt es einfach eine bestimmte Menge von möglichen Kombinationen, die zu behandeln sind.

        Alternativ zu dem, was ich gezeigt habe, könnte man auch versuchen die Termine nach Beginn zu sortieren und Lücken dazwischen zu finden - aber wirklich einfacher ist das auch nicht. Vor allem nicht, wenn Überlappungen der Termine möglich sind.

        Zu deiner Schlussfrage.

        Die Variablenersetzung in Strings "in doppelten Anführungszeichen" kennst Du? Vielleicht nicht, ich habe sie bei Dir kaum gesehen.

        Also:

        $a = "World";
        echo "Hello $a";
        // gibt aus: Hello World,
        

        Das funktioniert in "einfachen" Fällen ganz gut. PHP versteht sogar Arrays und Verweise auf Objekte:

        $x = [ 1,2,3, "foo" => "bar" ];
        $y = new Zeitintervall();
        $y->von = "08:00";
        $y->bis = "12:00";
        echo "Eintrag 1 ist $x[1], für foo haben wir $x[foo]. Zeit von $x->von bis $x->bis";
        $a = "foo";
        echo "$a_bar";   // gibt Fehlermeldung aus: Variable a_bar unbekannt
        

        Man beachte: keine Anführungszeichen um das "foo".

        Damit ist aber auch Schluss. PHP muss erkennen können, wo eine Variable endet, und kompliziertere Zugriffe wie diese sind so nicht möglich. Für weiter gehende Fälle gibt es die "komplexe Syntax". Man schließt dafür den Variablenzugriff in geschweifte Klammern ein. Wichtig ist nur, dass das $ direkt hinter dem { steht, kein Space dazwischen.

        // Mehrfacher Index
        echo "Name: {$tabelle[3][name]}"; 
        // Explizites Klarmachen, wo der Variablenname endet
        $a = "foo";
        echo "{$a}_bar";
        

        Das, was im letzten Beispiel steht, habe ich bei Dir gemacht. Statt der Variablenersetzng kann man auch eine Stringverkettung benutzen, das ist nur mehr Schreibarbeit. "{$a}_bar" ist gleichbedeutend mit ($a . "_bar").

        Ich schreibe Dir den Code, den Du nicht verstanden hast, mal in unterschiedlichen Kompressionsstufen auf:

        // Ganz kurz
        $w_prefix = ['so', 'mo', 'di', 'mi', 'do', 'fr', 'sa'][date("w", $zeit)];
        $von = $arrayUserAktiv["{$w_prefix}_von"];
        $bis = $arrayUserAktiv["{$w_prefix}_bis"];
        
        // Etwas länger
        $w_tage = ARRAY('so', 'mo', 'di', 'mi', 'do', 'fr', 'sa');
        $w_prefix = $w_tage[date("w", $zeit)];
        
        $von = $arrayUserAktiv[$w_prefix . "_von"];
        $bis = $arrayUserAktiv[$w_prefix . "_bis"];
        
        // Ganz ausführlich
        $w_tage = ARRAY('so', 'mo', 'di', 'mi', 'do', 'fr', 'sa');
        $w_tag_nr = date("w", $zeit);
        $w_prefix = $w_tage[$w_tag_nr];
        $von_key = $w_prefix . "_von";
        $bis_key = $w_prefix . "_bis";
        
        $von = $arrayUserAktiv[$von_key];
        $bis = $arrayUserAktiv[$bis_key];
        
        

        Im ersten Schritt wird über die Wochentagnummer ein Wochentagkürzel (so, mo, ..., sa) bestimmt.

        Aus dem Wochentagkürzel leiten sich dann die Zugriffsschlüssel auf $arrayUserAktiv ab. Entweder mit Variablenersetzung, oder mit Stringverkettung. Deine Array-Schlüssel heißen mo_von oder sa_bis, genau das baue ich zusammen.

        Mit diesen Zugriffsschlüsseln können dann die von- und bis-Werte für den Tag ausgelesen werden. Die eigentlich Magick ist, dass auch für ein assoziatives Array die Indexe in Variablen stehen können.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo,

          $start = "08:00";
          $ende  = "17:00";
          
          $termine = "07:00";
          
          if ($termine < $start) {
          
          	$start = $termine;
           } 
          
           echo $termine;
          

          ich weiß ja nicht, ob man irgendwie somit zurecht kommt, dieses ist mir gerade beim Fahrradfahren eingefallen.

          Also dass man das irgendwie ständig mit einem vergleich macht? Denn Start und Ende von der Verfügbarkeit habe ich ja.

          1. Hallo Bernd,

            geht es immer noch um die freien Zeiträume?

            Wenn ja: ich sehe deinen Gedankengang noch nicht. Irgendwie muss ein Array existierender Termine verarbeitet werden und ein Array freier Zeiträume herauskommen, oder?

            Rolf

            --
            sumpsi - posui - clusi
            1. So, ich habe eine andere Idee, kommen wir damit vielleicht weiter?

              $abwesend[] = array('Von' => "15:00", 
                                'Bis' => "16:30");
              
              $abwesend[] = array('Von' => "10:00", 
                                'Bis' => "11:00");
              
              $abwesend[] = array('Von' => "12:15", 
                                'Bis' => "13:00");
              
              
              foreach ($abwesend as $xx => $zeiten)
              {
                  $Von[$xx]  = strtolower( $zeiten['Von'] );
                  $Bis[$xx]  = strtolower( $zeiten['Bis'] );
              }
               
              array_multisort($Von, SORT_ASC, $abwesend);
               
              print_r ( $abwesend );
              

              Als Ausgabe erhalte ich dieses

              Array
              (
                  [0] => Array
                      (
                          [Von] => 10:00
                          [Bis] => 11:00
                      )
              
                  [1] => Array
                      (
                          [Von] => 12:15
                          [Bis] => 13:00
                      )
              
                  [2] => Array
                      (
                          [Von] => 15:00
                          [Bis] => 16:30
                      )
              
              )
              

              Damit habe ich jetzt schon einmal alle Zeiten. Kann ich jetzt nicht schauen ob was als Ende im ersten Array hinterlegt ist, in diesem Fall die 11 und schau direkt was im nächsten Array als Start hinterlegt ist in diesem Fall die 12:15. Jetzt müsste ich irgendwie ein $Da bei jedem Durchlauf und füge folgendes hinzu

              • 11:00 bis 12:15 Uhr

              Dann gehe weiter und hänge wieder etwas an $Da, in diesem Fall wäre die Ausgabe dann so

              • 11:00 bis 12:15 Uhr
              • 13:00 bis 15:00 Uhr

              usw.... lässt sich damit vielleicht arbeiten und funktioniert mein Vorhaben überhaupt in dieser Form?

              1. Hallo,

                funktioniert mein Vorhaben überhaupt in dieser Form?

                Was nicht direkt mit der Programmierung zusammhängt: hast du eigentlich die Vor- und Nachbereitungszeit für die Termine miteingerechnet? Die geht gerne mal vergessen und führt dann zu Überstunden...

                Gruß
                Kalk

                1. Hallo,

                  Was nicht direkt mit der Programmierung zusammhängt: hast du eigentlich die Vor- und Nachbereitungszeit für die Termine miteingerechnet? Die geht gerne mal vergessen und führt dann zu Überstunden...

                  die Nachbereitungszeiten sind in der Regel in die gebuchten Zeiten mit eingerechnet. Die Anzeige soll nur für uns Intern eine Übersicht darstellen wie wann wo ein externer Mitarbeiter gebucht ist. Die Tatsächlichen Stunden können davon natürlich abweichen.

              2. Ok, ich bin ein kleinen Schritt weiter

                $Da = "";
                
                $abwesend[] = array('Von' => "15:00", 
                                  'Bis' => "16:30");
                
                $abwesend[] = array('Von' => "10:00", 
                                  'Bis' => "11:00");
                
                $abwesend[] = array('Von' => "12:15", 
                                  'Bis' => "13:00");
                
                
                foreach ($abwesend as $xx => $zeiten)
                {
                    $Von[$xx]  = strtolower( $zeiten['Von'] );
                    $Bis[$xx]  = strtolower( $zeiten['Bis'] );
                }
                 
                array_multisort($Von, SORT_ASC, $abwesend);
                
                echo "<pre>";
                print_r ( $abwesend );
                echo "</pre>";
                
                echo "<br><br>";
                
                
                foreach ($abwesend as $xx => $zeiten)
                {
                    echo "Von: " . $zeiten['Von'] . "<br>";
                    echo "Bis: " . $zeiten['Bis'] . "<br><br>";
                
                    $Da .= "Anhängen <br>";
                }
                
                echo "<br>";
                echo "<strong>Zeiten</strong>:<br>" . $Da;
                

                Jetzt ist noch die Frage, wie kann ich die Einträge der Reihe nach vergleichen um das $Da sinnvoll zu füllen. Da habe ich derzeit leider überhaupt keine Ahnung.

                1. Meine Idee jetzt war

                  foreach ($abwesend as $xx => $zeiten)
                  {
                     
                  	  echo "Index: " . $xx . "<br>";
                    
                      echo "Von: " . $zeiten['Von'] . "<br>";
                      echo "Bis: " . $zeiten['Bis']. "<br><br>";
                  
                      $Da .= $zeiten['Bis'] . " bis " . $zeiten['Von'] . "<br>";
                  }
                  

                  Klappt leider nicht ganz. Als Ergebnis erhalte ich folgedes

                  11:00 bis 10:00
                  13:00 bis 12:15
                  16:30 bis 15:00
                  

                  Ich sollte bei $zeiten['Von'] immer den nächsten Eintrag kennen, dieses wird so wohl nicht machbar sein?

                  1. Hallo Bernd,

                    da war was 😂: Alternativ zu dem, was ich gezeigt habe, könnte man auch versuchen die Termine nach Beginn zu sortieren und Lücken dazwischen zu finden - aber wirklich einfacher ist das auch nicht. Vor allem nicht, wenn Überlappungen der Termine möglich sind.

                    Ich nehme mal an, dass Du Die Inhalte deines $abwesend-Arrays nachher aus der Datenbank holst. Da kannst Du einen ORDER BY t_von ins SQL schreiben und brauchst Dir keinen Kopf mit Multisort zu machen. D.h. für deine Experimente kannst Du dein Array gleich so aufbauen, wie Du es nachher aus der DB bekommst. Eine Trennung in $von und $bis Array würde ich auch für ungünstig halten. Aus der DB bekommst Du Rows, d.h. von und bis sind dann in einem Zeilen-Array. Auf dieser Struktur solltest Du aufsetzen. Ich würde die Testdaten so hinschreiben (unter der Annahme, dass deine DB-Felder t_von und t_bis lauten):

                    $termine = [ [ 't_von' => "10:00", 't_bis' => "11:00") ],
                                 [ 't_von' => "12:15", 't_bis' => "13:00") ],
                                 [ 't_von' => "15:00", 't_bis' => "16:30") ]
                               ];
                    

                    Bzw. wenn Du unbedingt selbst sortieren willst, ist das Sortieren eines solchen Arrays mit usort einfacher:

                    usort($termine, function($t1, $t2) { return $t1['t_von'] <=> $t2['t_von']; });
                    

                    usort bekommt eine Callback-Funktion als Parameter und übergibt ihr die beiden Array-Einträge, für die eine Information "kleiner, gleich oder größer" gebraucht wird. Dazu muss die Callback-Funktion einen Wert kleiner als 0, gleich 0 oder größer als 0 zurückgeben. Der "Spaceship" Operator (ab PHP 7 verfügbar) tut genau das. Solltest Du noch bei PHP 5.x stecken - hm, weg da, ist tot. Bis dahin kannst Du statt Spaceship auch $t1['t_von'] < $t2['t_von'] ? -1 : 1; verwenden.

                    Aber - wie gesagt - mach Dir um die Sortiererei keinen Kopf, wenn Du das nachher im SQL lösen kannst.

                    Dein anderes Problem ist die foreach-Schleife. Die eignet sich nicht, wenn man zwei Array-Elemente gleichzeitig braucht. Nimm for ($i=1; $i<count($termine); $i++). Beachte: Start bei $i=1. Und dann verwende die Array-Einträge bei $i-1] und $i. Achte aber auch auf die mögliche Freizeit vor dem ersten und nach dem letzten Termin!

                    Rolf

                    --
                    sumpsi - posui - clusi
                    1. Hallo,

                      nein, ich bin nicht scharf drauf das ganze händisch zu sortieren, dieses soll später die Datenbank direkt machen. Ich habe alles etwas angepasst, aber erhalte ein merkwürdiges Ergebnis

                      $Da = "";
                      
                      $termine = [ [ 't_von' => "10:00", 't_bis' => "11:00" ],
                                   [ 't_von' => "12:15", 't_bis' => "13:00" ],
                                   [ 't_von' => "15:00", 't_bis' => "16:30" ]
                                 ];
                      
                      echo "<pre>";
                      print_r ( $termine );
                      echo "</pre>";
                      
                      echo "<br><br>";
                      
                      for ($i=0; $i<count($termine); $i++)
                      {
                           
                          echo "Von: " . $termine[$i]['t_von'] . "<br>";
                          echo "Bis: " . $termine[$i]['t_bis']. "<br><br>";
                      
                          $Da .= $termine[$i]['t_bis'] . " bis " . $termine[$i-1]['t_von'] . "<br>";
                      }
                      
                      echo "<br>";
                      echo "<strong>Zeiten</strong>:<br>" . $Da;
                      
                      echo "<br><br>";
                      
                      Array
                      (
                          [0] => Array
                              (
                                  [t_von] => 10:00
                                  [t_bis] => 11:00
                              )
                      
                          [1] => Array
                              (
                                  [t_von] => 12:15
                                  [t_bis] => 13:00
                              )
                      
                          [2] => Array
                              (
                                  [t_von] => 15:00
                                  [t_bis] => 16:30
                              )
                      
                      )
                      
                      
                      Von: 10:00
                      Bis: 11:00
                      
                      Von: 12:15
                      Bis: 13:00
                      
                      Von: 15:00
                      Bis: 16:30
                      
                      
                      Zeiten:
                      11:00 bis 
                      13:00 bis 10:00
                      16:30 bis 12:15
                      

                      Was passiert hier? Warum werden die unteren Werte so durcheinander geschmissen?

                      1. Ich bin Schritt weiter, keine Ahnung ob dieses so korrekt ist

                        $Da = "";
                        
                        $Ende = "18:00";
                        
                        $termine = [ [ 't_von' => "10:00", 't_bis' => "11:00" ],
                                     [ 't_von' => "12:15", 't_bis' => "13:00" ],
                                     [ 't_von' => "15:00", 't_bis' => "16:30" ]
                                   ];
                        
                        echo "<pre>";
                        print_r ( $termine );
                        echo "</pre>";
                        
                        echo "<br><br>";
                        
                        for ($i=0; $i<count($termine); $i++)
                        {
                            
                            if ($i+1 <count($termine)) {
                            	$Da .= $termine[$i]['t_bis'] . " bis " . $termine[$i+1]['t_von'] . "<br>";
                            } else  {
                            	$Da .= $termine[$i]['t_bis'] . " bis " . $Ende;
                            }
                        
                            echo "Von: " . $termine[$i]['t_von'] . "<br>";
                            echo "Bis: " . $termine[$i]['t_bis']. "<br><br>";
                        
                        
                        }
                        
                        echo "<br>";
                        echo "<strong>Zeiten</strong>:<br>" . $Da;
                        
                        echo "<br><br>";
                        

                        Die Ausgabe schaut so aus

                        Array
                        (
                            [0] => Array
                                (
                                    [t_von] => 10:00
                                    [t_bis] => 11:00
                                )
                        
                            [1] => Array
                                (
                                    [t_von] => 12:15
                                    [t_bis] => 13:00
                                )
                        
                            [2] => Array
                                (
                                    [t_von] => 15:00
                                    [t_bis] => 16:30
                                )
                        
                        )
                        
                        
                        Von: 10:00
                        Bis: 11:00
                        
                        Von: 12:15
                        Bis: 13:00
                        
                        Von: 15:00
                        Bis: 16:30
                        
                        
                        Zeiten:
                        11:00 bis 12:15
                        13:00 bis 15:00
                        16:30 bis 18:00
                        

                        Vom Gefühl müsst es stimmen. Nur was mache ich jetzt mit dem Start? Und was ist wenn Termine sich jetzt überlappen? Das heißt ich müsste jetzt innerhalb der for noch eine IF einbauen und prüfen ob ein Termin sich überlappt? Wenn sich ein Termin überlappt dann interessiert mich das erste Ende nicht.

                        1. Hier mal noch ein Beispiel, wie es laufen könnte

                          $AufTermin = "";
                          $Start     = "09:00";
                          $Ende      = "17:30";
                          
                          //$termine = [ [ 't_von' => "10:00", 't_bis' => "11:00" ],
                          //             [ 't_von' => "12:15", 't_bis' => "13:00" ],
                          //             [ 't_von' => "15:00", 't_bis' => "16:30" ]
                          //           ];
                          
                          $termine = [ [ 't_von' => "10:00", 't_bis' => "13:00" ],
                                       [ 't_von' => "10:00", 't_bis' => "18:30" ]
                                     ];
                          
                          echo "<pre>";
                          print_r ( $termine );
                          echo "</pre>";
                          
                          echo "<br><br>";
                          
                          for ($i=0; $i<count($termine); $i++)
                          {
                              
                              if ($i+1 <count($termine)) {
                              	$AufTermin .= $termine[$i]['t_bis'] . " bis " . $termine[$i+1]['t_von'] . "<br>";
                              } else  {
                              	$AufTermin .= $termine[$i]['t_bis'] . " bis " . $Ende;
                              }
                          
                              echo "Von: " . $termine[$i]['t_von'] . "<br>";
                              echo "Bis: " . $termine[$i]['t_bis']. "<br><br>";
                          
                          
                          }
                          
                          echo "<br>";
                          echo "<strong>im Lager</strong>:<br>" . $AufTermin;
                          
                          echo "<br><br>";
                          

                          Die Ausgabe lautet

                          Array
                          (
                              [0] => Array
                                  (
                                      [t_von] => 10:00
                                      [t_bis] => 13:00
                                  )
                          
                              [1] => Array
                                  (
                                      [t_von] => 10:00
                                      [t_bis] => 18:30
                                  )
                          
                          )
                          
                          
                          Von: 10:00
                          Bis: 13:00
                          
                          Von: 10:00
                          Bis: 18:30
                          
                          
                          13:00 bis 10:00
                          18:30 bis 17:30
                          

                          Dieses passt nun überhaupt nicht mehr, richtig wäre

                          09:00 bis 10:00
                          

                          Warum von 09:00 - Weil der Start ganz oben auf 09:00 Uhr gesetzt ist.
                          Warum bis 10:00 - Weil der erste Termin um 10:00 Uhr beginnt.

                          Ende wäre 17:30 Uhr, der Termin geht aber bis 18:30 also muss nichts mehr angezeigt werden.

                          Hier überlappen sich zwei Termine

                          1. Hallo Bernd,

                            au weia. Böser Testfall. Die $i-1 und $i Variante kann diesen Monsterfall vermutlich nicht sinnvoll behandeln. Bzw. sie muss dann ein Maximum der bisher gefundenen Termin-Enden mitführen, und entwickelt sich dann zu einem komplizierten Monster.

                            Die von mir im 17:59 Beitrag gezeigte "Kurzversion" basiert implizit auf genau auf dem Mitführen dieses Maximums und kriegt es damit automatisch hin. Und sie ist viel kompakter...

                            Rolf

                            --
                            sumpsi - posui - clusi
                        2. Hallo Bernd,

                          for ($i=0; $i<count($termine); $i++) und if ($i+1 <count($termine))

                          es gab einen Grund, warum ich Dir schrieb, Du solltest bei $i=1 beginnen und dann die Einträge $i-1 und $i verwenden. Dadurch wird genau diese Abfrage überflüssig. Freie Zeiten zu Beginn und am Ende fragt man besser separat ab.

                          Prinzipiell gibt es zwei „richtige“ Ansätze.

                          Entweder
                          du beginnst bei 0, und läufst bis count($termine)-1
                          und verwendest dann $i und $i+1
                          Oder
                          du beginnst bei 1, und läufst bis count($termine)
                          und verwendest dann $i-1 und $i

                          Welche Variante du nimmst, ist letztlich egal. Für das Zeitfenster am Ende braucht man eh count($termine)-1, da kann man die ENTWEDER Variante auch nehmen.

                          Und ja, richtig, für überlappende Termine musst Du prüfen ob
                          $termine[$i-1]['bis'] >= $termine[$i]['von'] gilt. Wenn ja, ist keine Lücke da.

                          Für den Zeitraum am Anfang:

                          $Anfang = "9:00";
                          $Ende = "18:00";
                          $Da = "";
                          $lastI = count($termine) - 1;
                          // Gar kein Termin da?
                          if ($lastI < 0)
                          {
                             $Da = $Anfang . " bis " . $Ende;
                          }
                          else
                          {
                             if ($Anfang < $termine[0]['t_von'])
                             {
                                $Da .= $Anfang . " bis " . $termine[0]['t_von'];
                             }
                             for ($i=0; $i < $lastI; $i++)
                             {
                                if ($termine[$i]['t_bis'] < $termine[$i+1]['t_von'])
                                {
                                   $Da .= $termine[$i]['t_bis'] . " bis " . $termine[$i+1]['t_von'] . "<br>";
                                }
                             }
                             if ($termine[$lastI]['t_bis'] < $Ende)
                             {
                                $Da .= $termine[$lastI]['t_bis'] . " bis " . $Ende;
                             }
                          }
                          
                          echo "Zeiten: " . $Da;
                          

                          patsch Rolf, Du Depp.

                          Mir fällt gerade auf, dass es auch viel kürzer geht. Man kann sich einfach nur die Endezeit des vorigen Termins merken, und eliminiert mit zwei Tricks die Sonderfälle für die Randzeiten sowie die Abfrage auf "es gibt heute keine Termine". Dann kann man sogar wieder foreach verwenden. Wenn Du diese Variante verstehst, verwende sie 😀. Aber nur dann!!!

                          $Anfang = "09:00";
                          $Ende = "18:00";
                          $Da = "";
                          
                          // Anfang als Ende des letzen Termins setzen
                          $vorigesBis = $Anfang;
                          // Pseudotermin hinzufügen für Ende der Arbeitszeit
                          $termine[] = [ 't_von' => $Ende, 't_bis' => 'xxxxx' ];
                          
                          // Und jetzt über alle Termine iterieren.
                          foreach ($termine as $termin)
                          {
                             if ($vorigesBis < $termin['t_von'])
                             {
                                $Da .= $vorigesBis . " bis " . $termin['t_von'] . "<br>";
                             }
                             if ($termin['t_bis'] > $vorigesBis)   // Falls ein Monstertermin andere überdeckt
                             {
                                $vorigesBis = $termin['t_bis'];
                             }
                          }
                          
                          echo "Zeiten: <br>" . $Da;
                          

                          All diese Varianten sind für Datenmüll anfällig. Wenn Du einen Termin hast, der andere Termine komplett überdeckt (Termin 1 von 10-18 Uhr, Termin 2 von 12-13 Uhr), dann wirst Du 13-18 Uhr als Freizeit bekommen. Deswegen diese "Anti-Monster Maßnahme": lass $vorigesBis nur wachsen, aber nie kleiner werden.

                          So isses beim Programmieren - man macht und macht und auf einmal geht's bling und man sieht eine viel kompaktere Lösung. Ob sie einfacher ist, bleibe dahingestellt. Durch das Nachführen von $lastEnd entsteht eine höhere Komplexität, weil sich ein Schleifendurchlauf auf ein Ergebnis aus dem Durchlauf davor beziehen muss.

                          Und dann kommt so ein böser Testfall - wie der von Dir vorher gepostete - und macht den ursprünglichen Plan auch noch kaputt.

                          Rolf

                          --
                          sumpsi - posui - clusi
                          1. Hallo,

                            wow, vielen vielen lieben Dank. Dein zweites Beispiel, also das kürzere funktioniert wunderbar. Hab jetzt einige Einträge getestet die ich zur verfügung hatte und alle haben gestimmt.

                            Ich finde es auch viel kürzer als dein Code in der ersten Antwort:
                            https://forum.selfhtml.org/self/2019/may/29/darstellung-strich-ausgabe-von-weiteren-eintraege-abhaengig-machen/1749562#m1749562

                            Was ich noch nicht ganz verstehe ist diese Zeile

                            // Pseudotermin hinzufügen für Ende der Arbeitszeit
                            $termine[] = [ 't_von' => $Ende, 't_bis' => 'xxxxx' ];
                            

                            Warum steht diese so alleine und ist nicht mit im ersten Array, also diesem

                            $termine = [ [ 't_von' => "10:00", 't_bis' => "11:00" ],
                                         [ 't_von' => "12:15", 't_bis' => "13:00" ],
                                        [ 't_von' => "15:00", 't_bis' => "16:30" ]
                                       ];
                            

                            und warum ist t_von = Ende und t_bis xxxxx? OK, es funktioniert, das ist das wichtigste.

                            1. Hallo Bernd,

                              die Zeile steht allein, weil sie nicht aus der DB kommt.

                              Das Array simuliert ja die Termine aus der DB, und diesen fügt das Programm noch einen Pseudotermin hinzu, der für den Beginn des Feierabends steht. Deswegen ist t_bis ein nur ein Platzhalterwert. Ob da nun 'xxxxx' steht oder 'Bernd' oder sonstwas - das ist wurscht. Dieser Wert wird nicht benutzt. Die Schleife verarbeitet pro Durchlauf den Zeitraum von $vorigesBis bis $termin['t_von']. Im letzten Durchlauf wird der Pseudotermin verarbeitet und $termin['t_von'] ist gleich $Ende.

                              Rolf

                              --
                              sumpsi - posui - clusi
                              1. Hallo,

                                irgendwie stehe ich gerade total auf dem Schlauch liegt auch daran, dass ich mit so einem Array wie wir es hier haben noch nie gearbeitet habe.

                                Ich habe folgende Funktion

                                function MitarbeiterKalenderTagesansicht($mysqli, $datum, $user) {
                                    
                                        $stmt = $mysqli->prepare("
                                
                                            SELECT kt_id, kt_kalenderID, kt_datum, k_ganztags, k_von, k_bis, kp_userID
                                            FROM kalender_termine 
                                
                                            LEFT JOIN kalender ON 
                                                      kalender.k_code = kalender_termine.kt_kalenderID
                                            LEFT JOIN kalender_personal ON 
                                                      kalender_personal.kp_code = kalender_termine.kt_kalenderID
                                            
                                            WHERE kt_datum=? AND kp_userID=?");
                                       
                                        $stmt->bind_param("ss", $datum, $user);
                                        $stmt->execute();
                                        $stmt->bind_result($kt_id, $kt_kalenderID, $kt_datum, $k_ganztags, $k_von,
                                                            $k_bis, $kp_userID);
                                        $stmt->store_result();
                                        
                                        if($stmt->num_rows() >  0) {     
                                            
                                            while ($stmt->fetch()){
                                                
                                                $MitarbeiterKalenderTagesansicht[] = array( 
                                                    
                                                    'kt_id'          => $kt_id,
                                                    'kt_kalenderID'  => $kt_kalenderID,
                                                    'kt_datum'       => $kt_datum,
                                                    'k_ganztags'     => $k_ganztags,
                                                    'k_von'          => $k_von,
                                                    'k_bis'          => $k_bis,
                                                    'kp_userID'      => $kp_userID
                                                
                                                );
                                            }
                                            return $MitarbeiterKalenderTagesansicht;
                                            }
                                    }
                                

                                Und dann habe ich noch diesen Bereich

                                <?php 
                                if($MitarbeiterLager > 0) {
                                    foreach($MitarbeiterLager as $arrayMitarbeiterLager){
                                
                                        $MitarbeiterKalenderTagesansicht = MitarbeiterKalenderTagesansicht($mysqli, $_GET['date'], $arrayMitarbeiterLager['userid']);
                                        foreach($MitarbeiterKalenderTagesansicht as $arrayKalenderTagesansicht){ ?>
                                            <?php //echo $arrayKalenderTagesansicht['k_von'] . " - " . $arrayKalenderTagesansicht['k_bis'] . "<br>";?>
                                        <?php } ?>
                                    
                                <div style="font-weight: bold; margin-bottom: 5px;"><?php echo $arrayMitarbeiterLager['per_vorname'] . " " . $arrayMitarbeiterLager['per_name'] ; ?></div>
                                <div style="margin-bottom: 1em">
                                
                                
                                <?php   
                                   $w_prefix = ARRAY('so', 'mo', 'di', 'mi', 'do', 'fr', 'sa')[date("w", $zeit)];
                                   $von = $arrayMitarbeiterLager["{$w_prefix}_von"];
                                   $bis = $arrayMitarbeiterLager["{$w_prefix}_bis"];
                                
                                   if ($von != "")
                                   {
                                      echo "$von Uhr bis $bis Uhr";
                                   }
                                   else
                                   {
                                      echo "nach Bedarf";
                                   }
                                ?>
                                
                                </div>
                                
                                <?php
                                }}
                                else { echo "Keine Mitarbeiter im Lager"; }
                                ?>
                                

                                Jetzt muss ich meines mit deinem irgendwie verbinden

                                $termine = [ [ 't_von' => "10:00", 't_bis' => "11:00" ],
                                             [ 't_von' => "12:15", 't_bis' => "13:00" ],
                                            [ 't_von' => "15:00", 't_bis' => "16:30" ]
                                           ];
                                
                                $Anfang = "09:00";
                                $Ende = "16:00";
                                $Da = "";
                                
                                // Anfang als Ende des letzen Termins setzen
                                $vorigesBis = $Anfang;
                                // Pseudotermin hinzufügen für Ende der Arbeitszeit
                                $termine[] = [ 't_von' => $Ende, 't_bis' => 'xxxxx' ];
                                
                                // Und jetzt über alle Termine iterieren.
                                foreach ($termine as $termin)
                                {
                                   if ($vorigesBis < $termin['t_von'])
                                   {
                                      $Da .= $vorigesBis . " bis " . $termin['t_von'] . "<br>";
                                   }
                                   if ($termin['t_bis'] > $vorigesBis)   // Falls ein Monstertermin andere überdeckt
                                   {
                                      $vorigesBis = $termin['t_bis'];
                                   }
                                }
                                
                                echo "Zeiten: <br>" . $Da;
                                
                                1. Hallo Bernd,

                                  ich versuche mal zu rekapitulieren.

                                  $arrayMitarbeiterLager enthält für einen Mitarbeiter die User-ID, Vor- und Nachname, und 7 Pärchen aus von und bis, jeweils mit mo, di, mi, do, fr, sa, so davor. Vielleicht enthält es noch mehr, aber das wird hier nicht verwendet.

                                  Du holst zu diesem Eintrag in $arrayMitarbeiterLager die Termine des Mitarbeiters zum Termin $_POST['date'].

                                  Und jetzt möchtest Du ausgeben, wann der Mitarbeiter an diesem Tag im Lager ist, sprich: wann er nicht auf Terminen ist.

                                  Da müsste zunächst mal geklärt werden, was es mit der Variablen $zeit auf sich hat. Wie verhält sich $zeit zu $_POST['date']? Das sollte der gleiche Tag sein, sonst passt was was nicht. Und wenn es der gleiche Tag ist, dann sollte das vielleicht auch die gleiche Variable sein (es sei denn, du bringst die Datumsformate nicht übereinander).

                                  Ansonsten kannst Du doch ganz prima $MitarbeiterKalenderTagesansicht auf das $termine-Array in unserem theoretischen Code abbilden. Die Schlüsselnamen sind leicht unterschiedlich, das ist schnell geändert. Die Variablen $Anfang und $Ende sollten dem $von und $bis entsprechen, das Du zum Wochentag aus $arrayMitarbeiterLager ermittelst.

                                  Oder übersehe ich da gerade den Knackpunkt?

                                  Rolf

                                  --
                                  sumpsi - posui - clusi
                                  1. Hallo,

                                    Da müsste zunächst mal geklärt werden, was es mit der Variablen $zeit auf sich hat.

                                    Die Variable $Zeit fülle ich ganz zu beginn

                                    $zeit = strtotime($_GET["date"]);
                                    

                                    Wie verhält sich $zeit zu $_POST['date']? Das sollte der gleiche Tag sein, sonst passt was was nicht.

                                    $_POST['date'] habe ich nicht im Einsatz. Wo hast du dieses gesehen?

                                    Ich habe hier mal ein Test gemacht ob ich die richtigen Einträge erhalte, dieses ist der Fall

                                    $MitarbeiterKalenderTagesansicht = MitarbeiterKalenderTagesansicht($mysqli, $_GET['date'], $arrayMitarbeiterLager['userid']);
                                    
                                    foreach($MitarbeiterKalenderTagesansicht as $arrayKalenderTagesansicht){ ?>
                                      <?php //echo $arrayKalenderTagesansicht['k_von'] . " - " . $arrayKalenderTagesansicht['k_bis'] . "<br>";?>
                                    <?php } ?>
                                    

                                    Jetzt müsste ich dieses nur irgendwie mit deinem Code verbinden und da habe ich derzeit meine Probleme.

                                    1. Hallo Bernd,

                                      $_POST['date'] habe ich nicht im Einsatz.

                                      Muh - dann eben $_GET['date'] 🐄
                                      Aber du hast es beantwortet - date("w"...) braucht ein time_t Format und der SQL Zugriff einen String.

                                      Hinweise zum Verbinden habe ich Dir gegeben.

                                      Rolf

                                      --
                                      sumpsi - posui - clusi
                                      1. Hallo,

                                        das Problem ist, ich weiß nicht wie ich so etwas mit den Werten aus meiner Datenbank füllen kann

                                        $termine = [ [ 't_von' => "10:00", 't_bis' => "11:00" ],
                                                     [ 't_von' => "12:15", 't_bis' => "13:00" ],
                                                    [ 't_von' => "15:00", 't_bis' => "16:30" ]
                                                   ];
                                        

                                        Ich denke ich sollte es so machen wie in meinem ersten Beispiel, dann kann ich dieses in der schleife sooft füllen wie ich es brauche?

                                        $termine[] = array('Von' => "15:00", 'Bis' => "16:30");
                                        $termine[] = array('Von' => "15:00", 'Bis' => "16:30");
                                        $termine[] = array('Von' => "15:00", 'Bis' => "16:30");
                                        usw....
                                        
                                        1. Hallo Bernd,

                                          bitte den Panik Modus beenden und nachdenken.

                                          Wie ist die Struktur von $MitarbeiterKalenderTagesansicht, im Vergleich zu $termine?

                                          Na?

                                          Genau: beide sind ein Array aus assoziativen Arrays. In einem Eintrag in $MitarbeiterKalenderTagesansicht steht mehrdrin, das muss dich für die Aufgabe aber nicht interessieren.

                                          Also, nicht umkopieren, einfach damit loslegen (und die leicht anderen Schlüssel beachten).

                                          Rolf

                                          --
                                          sumpsi - posui - clusi