Jörg: Wert wird nicht ausgegeben, ich finde den Fehler nicht

Hallo Forum,

irgendwie habe ich grad ein Brett vorm Kopf, scheint mir.

In einer Schleife nutze ich folgenden Code:

while (...) {  // Schleife auf
$i = 0;
if($AnzahlTermine > 0) {
    foreach($arrDay[$myUser][$Datum]['Vorgang'] as $ID => $value) {
        $i++;
        if($i != $AnzahlTermine) {
            echo "<br>";
        } else {
            echo "<span class='rot1b'>".$arrDay[$myUser][$Datum]['DaySum']."</span>";
        }
    }
} else {
    echo "<span class='rot1b'>".$arrDay[$myUser][$Datum]['DaySum']."</span>";
}
} // Schleife zu

Eigentlich sonnenklar, was der Code machen soll:

Wenn an einem Tag mehrere Termine stattfanden, soll die Gesamtzahl der Stunden (diese Spalte gibt die Summer aus, vorherige Spalten die Einzelstunden je Termin) auf die letzte Zeile notiert werden.

Und falls keine Termine stattfanden, soll ebenfalls die Summer der Stunden angezeigt werden (else). Denn die kann auch ohne Termine einen Wert größer 0 haben.

Unter php 7.4 hat der Code auch funktioniert, aber seit php 8.1 nicht mehr.

Hingegen folgender Code funktioniert (nur, dass er dann den Wert der Gesamtstunden höhenmäßig in die Mitte der Spalte schreibt).

while (...) {
echo "<span class='rot1b'>".$arrDay[$myUser][$Datum]['DaySum']."</span>";
}

Kann mir das einer erklären?

Jörg

  1. @@Jörg

    In einer Schleife nutze ich folgenden Code:

    while (...) {  // Schleife auf
    $i = 0;
    if($AnzahlTermine > 0) {
        foreach($arrDay[$myUser][$Datum]['Vorgang'] as $ID => $value) {
            $i++;
            if($i != $AnzahlTermine) {
                echo "<br>";
            } else {
                echo "<span class='rot1b'>".$arrDay[$myUser][$Datum]['DaySum']."</span>";
            }
        }
    } else {
        echo "<span class='rot1b'>".$arrDay[$myUser][$Datum]['DaySum']."</span>";
    }
    } // Schleife zu
    

    Eigentlich sonnenklar, was der Code machen soll:

    Nö. Dein Code ist unübersichtlich.

    Gib HTML-Tags nicht mit echo aus! Verwende keine geschweiften Klammern, sondern die alternative Syntax für Kontrollstrukturen!

    Sieht dann so aus:

    <?php while (...):
            $i = 0;
            if ($AnzahlTermine > 0): 
              foreach ($arrDay[$myUser][$Datum]['Vorgang'] as $ID => $value):
                $i++;
                if ($i != $AnzahlTermine):
    ?>
                  <br>
    <?php       else: ?>
                  <span class='rot1b'>
                    <?= $arrDay[$myUser][$Datum]['DaySum'] ?>
                  </span>
    <?php       endif;
              endforeach;
            else:
    ?>
                  <span class='rot1b'>
                    <?= $arrDay[$myUser][$Datum]['DaySum'] ?>
                  </span>
    <?php   endif;
          endwhile;
    ?>
    

    Das <br> lässt erahnen, dass dein Script suboptimalen HTML-Code generiert.

    Wenn an einem Tag mehrere Termine stattfanden, soll die Gesamtzahl der Stunden (diese Spalte gibt die Summer aus, vorherige Spalten die Einzelstunden je Termin) auf die letzte Zeile notiert werden.

    Ah ja, Spalten – also eine Tabelle‽ Warum spans und kein Tabellenmarkup?

    Und bei vernünftigem Markup lässt sich die Ausrichtung bestimmt auch mit CSS hinbekommen.

    Bei

    🖖 Живіть довго і процвітайте

    --
    When the power of love overcomes the love of power the world will know peace.
    — Jimi Hendrix
    1. Hallo Gunnar,

      ich nehme an, das Tabellenmarkup ist drumherum und wird im nicht gezeigten Code produziert. Der Span dient nur zur Rotfärbung - statt die ganze Zelle entsprechend zu stylen. Oder die Summe ist vergammelt (to rot)…

      Rolf

      --
      sumpsi - posui - obstruxi
    2. Hallo Gunnar,

      Nö. Dein Code ist unübersichtlich.

      Ist ein bisschen Gewohnheitssache.
      Ich finde zum Beispiel meinen Code übersichtilicher als Deinen mit den gefühlt 1000 öffnenden und schließenden php-Tags.

      Ah ja, Spalten – also eine Tabelle‽ Warum spans und kein Tabellenmarkup?

      Weil ich dieselben Spans auch außerhalb von tabellen einsetze.
      Das ist dann bequemer und ich habe keine so riesige Styledatei.

      Und bei vernünftigem Markup lässt sich die Ausrichtung bestimmt auch mit CSS hinbekommen.

      Einverstanden.

      Danke für Deine Denkanstöße.

      Gruß, Jörg

  2. Hallo Jörg,

    Eigentlich sonnenklar, was der Code machen soll

    Eigentlich gar nicht.

    Du lässt eine Schleife über $arrDay[$myUser][$Datum]['Vorgang'] laufen, was hoffentlich ein Array ist. Die Array-IDs und Werte kommen nach $ID und $value - werden dann aber in der Schleife überhaupt nicht verwendet.

    Unter php 7.4 hat der Code auch funktioniert, aber seit php 8.1 nicht mehr.

    Nein. Doch! Ohhhh! Und was sagt uns das jetzt? Was erwartest Du? Was passiert statt dessen? Kommt eine Fehlermeldung? Hast Du die Ausgabe von Fehlermeldungen eingeschaltet?

    Ich würde erwarten, dass pro Schleifendurchlauf eine Anzahl von <br> ausgegeben wird und danach in einem Span mit Klasse rot1b der Wert des DaySum-Eintrags. Die Anzahl der <br> ist um eins weniger als die Anzahl der Einträge im Vorgang-Array. Ich würde auch annehmen, dass $AnzahlTermine identisch ist mit count($arrDay[$myUser][$Datum]['Vorgang']

    Und damit würde ich das, was ich da sehe, so formulieren:

    while (...):
    
       $filler = str_repeat("<br>", max(0, $AnzahlTermine - 1));
    ?>
       <?= $filler ?>
       <span class='rot1b'><?= $arrDay[$myUser][$Datum]['DaySum']?></span>
    <?php
    
    endwhile;
    

    Update: alternative Kontrollstrukturen verwendet, echo vermieden.

    Es ist übrigens eher nicht nötig, die Positionierung mit <br> durchzuführen. Man kann auch über CSS erreichen, dass die Summe am unteren Rand der Zelle steht, die Du da ausfüllst. Für eine Tabellenzelle gibt's die vertical-align:bottom Eigenschaft. Bei einem Grid kann man auch mit align-items bzw. align-self arbeiten.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      Eigentlich gar nicht.

      Nicht? Inwiefern?

      Du lässt eine Schleife über $arrDay[$myUser][$Datum]['Vorgang'] laufen, was hoffentlich ein Array ist. Die Array-IDs und Werte kommen nach $ID und $value - werden dann aber in der Schleife überhaupt nicht verwendet.

      Einverstanden, sie werden nicht benötigt.
      UNd ja, das Array ist ein Array.

      Nein. Doch! Ohhhh! Und was sagt uns das jetzt? Was erwartest Du? Was passiert statt dessen? Kommt eine Fehlermeldung? Hast Du die Ausgabe von Fehlermeldungen eingeschaltet?

      Was passiert: Alles wird korrekt angezeigt, es sei denn, ein Tag hatte keine Termine, dann wird die else-Bedingung nicht ausgeführt.

      Und genau das verstehe ich nicht.

      Ich würde erwarten, dass pro Schleifendurchlauf eine Anzahl von <br> ausgegeben wird und danach in einem Span mit Klasse rot1b der Wert des DaySum-Eintrags. Die Anzahl der <br> ist um eins weniger als die Anzahl der Einträge im Vorgang-Array. Ich würde auch annehmen, dass $AnzahlTermine identisch ist mit count($arrDay[$myUser][$Datum]['Vorgang']

      Alle Annahmen sind so, wie Du sie annimmst.

      Und damit würde ich das, was ich da sehe, so formulieren:

      while (...):
      
         $filler = str_repeat("<br>", max(0, $AnzahlTermine - 1));
      ?>
         <?= $filler ?>
         <span class='rot1b'><?= $arrDay[$myUser][$Datum]['DaySum']?></span>
      <?php
      
      endwhile;
      

      Update: alternative Kontrollstrukturen verwendet, echo vermieden.

      Naja, Rolf. Selbst wenn Dein Code läuft und besser ist als meiner: Ich wüßte gerne, warum meiner nicht läuft, er scheint mir logisch zu sein.

      Es ist übrigens eher nicht nötig, die Positionierung mit <br> durchzuführen. Man kann auch über CSS erreichen, dass die Summe am unteren Rand der Zelle steht, die Du da ausfüllst. Für eine Tabellenzelle gibt's die vertical-align:bottom Eigenschaft. Bei einem Grid kann man auch mit align-items bzw. align-self arbeiten.

      Alles richtig.
      Trotzdem bringt es mir als Fragesteller oft mehr, die vermeintliche Logik mienes Codes als unlogishc zu erkennen, als eine fertige und wunderbare Lösung zu erhalten. Deshalb neben 1000Dank auch nochmal die Frage, warum denn mein Code nicht das macht, was ich erwarte. Nämlich die Tagessumme immer ausgeben, mal mit ein paar Zeilenumbrüchen vorher und mal ohne Selbige.

      Jörg

      1. Hallo Jörg,

        es sei denn, ein Tag hatte keine Termine, dann wird die else-Bedingung nicht ausgeführt. Und genau das verstehe ich nicht.

        Ich auch nicht. Dafür ist zu wenig Code von Dir sichtbar.

        Denkbare Ursachen angesichts dessen, was Du gepostet hast:

        • die äußere while-Schleife hat 0 Durchläufe
        • $AnzahlTermine ist nicht 0 - dann kommt er nicht in den else - und größer als count($arrDay[$myUser][$Datum]['Vorgang']) - dann kommt er auch im foreach nicht zur Ausgabe.
        • $arrDay[$myUser][$Datum]['Vorgang'] ist kein Array, dann gibt's eine Warning auf die Fingerchen und keinen foreach Durchlauf.

        Das müsstest Du jetzt mit Kontrollausgaben überprüfen.

        Hach ja, immer diese Hunde, die man zum Jagen tragen muss 😉

        Rolf

        --
        sumpsi - posui - obstruxi