Ben: Tabellenzeilen in unterschiedlichen Farben in PHP

Hi alle zusammen!

Ich arbeite zur Zeit an einem Filme-Archiv und möchte die "Cast und Crew" auf einer eigenen Seite darstellen. Diese werden aus einer Datenbank geladen und sind alle zusammen im Feld "cast_crew" gespeichert.

Diese sollen in Tabellenzeilen getrennt werden. Also zuerst die Regisseure, dann die Schauspieler in der nächsten Zeile usw.

Wie mache ich das, dass nur jede zweite Zeile eine andere Farbe hat? Also dass Zeile 1 hell, Zeile 2 dunkel und Zeile 3 wieder hell ist, wenn ich mit CSS Klassen vergeben möchte?

Hat jemand eine Idee?

Danke und liebe Grüße
Ben

  1. Hallo,

    Wie mache ich das, dass nur jede zweite Zeile eine andere Farbe hat? Also dass Zeile 1 hell, Zeile 2 dunkel und Zeile 3 wieder hell ist, wenn ich mit CSS Klassen vergeben möchte?

    der Modulo-Operator hilft Dir.

    Freundliche Grüße

    Vinzenz

    1. echo $begrüßung;

      Wie mache ich das, dass nur jede zweite Zeile eine andere Farbe hat? Also dass Zeile 1 hell, Zeile 2 dunkel und Zeile 3 wieder hell ist, wenn ich mit CSS Klassen vergeben möchte?
      der Modulo-Operator hilft Dir.

      Konkret geht das so: Man nehme eine Variable, die man bei der Ausgabe einer Zeile hochzählt. Beim Teilen durch zwei entsteht ein Rest oder keiner. Davon abhängig setzt man nun die hell- oder dunkel-Eigenschaft.

      Alternativ kann man bei zwei wechselnden Eigenschaften auch das rechte Bit testen, denn das wechselt ebenfalls bei jedem Inkrement-Schritt:

      $zaehler & 1

      ergibt 0 oder 1.

      Oder man merkt sich einfach den vorherigen Zustand als booleschen Wert und ändert diesen jeweils in den anderen, beispielsweise mit einer Negation.

      echo "$verabschiedung $name";

      1. Konkret geht das so: Man nehme eine Variable, die man bei der Ausgabe einer Zeile hochzählt. Beim Teilen durch zwei entsteht ein Rest oder keiner. Davon abhängig setzt man nun die hell- oder dunkel-Eigenschaft.

        Das kann dann so aussehen:

        $i=0;

        [START] Ausgabe
        class="$i%1 === 1 ? hell : dunkel"
        $i++
        [ENDE] Ausgabe

        1. Hallo,

          Konkret geht das so: Man nehme eine Variable, die man bei der Ausgabe einer Zeile hochzählt. Beim Teilen durch zwei entsteht ein Rest oder keiner. Davon abhängig setzt man nun die hell- oder dunkel-Eigenschaft.

          Das kann dann so aussehen:

          $i=0;

          [START] Ausgabe
          class="$i%1 === 1 ? hell : dunkel"
          $i++
          [ENDE] Ausgabe

          Nein, nicht so. Auch wenn ich nicht verstehe, was das zwischen [START] Ausgabe und [ENDE] Ausgabe genau sein soll, sind da viel zu viele Fehler drin:

          • wie dedlfix schrieb, ist Modulo Zwei zu rechnen, nicht Modulo 1,
          • Zeichenketten sind in Anführungszeichen zu setzen,
          • der normale Vergleichsoperator ist völlig ausreichend (Notice :-) )
            
          // Initialisiere den Zähler für die Zeilen  
          // Anfangswert: 1, damit Code leichter verständlich.  
          $zeile = 1;  
            
          // [...]  
            
          // Ermittle die zuzuweisende Klasse  
          // hell und dunkel sind keine gute Klassennamen.  
          $rowclass = ($zeile % 2 == 0) ? 'gerade' : 'ungerade';  
            
          // Erhöhe den Zeilenzähler  
          // Anmerkung: Ich weiß, dass man dies als Postinkrement in die vorherige  
          //            Codezeile packen könnte. Ich halte dies für eine wenig  
          //            verständliche Mikrooptimierung, die ich bewußt vermeide,  
          //            um lesbareren und damit wartbareren Code zu schreiben.  
          $zeile++;  
            
          // tu was mit dem Klassennamen  
          // [...]  
          
          

          Freundliche Grüße

          Vinzenz

          1. echo $begrüßung;

            • der normale Vergleichsoperator ist völlig ausreichend (Notice :-) )
              $rowclass = ($zeile % 2 == 0) ? 'gerade' : 'ungerade';

            Man kann sogar den Vergleich ganz weglassen. Der Rest einer Division durch 2 ist immer 0 oder 1, was durch PHPs automatische Typumwandlung in den Boolean-Kontext zu false oder true wird. Der Vergleich mit der 0 dreht nur noch zusätzlich die Logik um, was man aber durch eine Änderung der Reihenfolge der beiden Strings auch hinbekommt.

            echo "$verabschiedung $name";

            1. [latex]Mae  govannen![/latex]

              echo $begrüßung;

              • der normale Vergleichsoperator ist völlig ausreichend (Notice :-) )
                $rowclass = ($zeile % 2 == 0) ? 'gerade' : 'ungerade';

              Man kann sogar den Vergleich ganz weglassen. Der Rest einer Division durch 2 ist immer 0 oder 1, was durch PHPs automatische Typumwandlung in den Boolean-Kontext zu false oder true wird. Der Vergleich mit der 0 dreht nur noch zusätzlich die Logik um, was man aber durch eine Änderung der Reihenfolge der beiden Strings auch hinbekommt.

              Man kann auch den aufwendigen Modulo-Operator ganz weglassen und z.B. mit einer Variable (bool) arbeiten, die man einfach bei jedem Durchlauf negiert.

              $ist_gerade = false;  
              [start schleife]  
              $rowclass = ($ist_gerade) ? 'gerade' : 'ungerade';  
              $ist_gerade = !ist_gerade;  
              [/ende schleife]
              

              Wobei man die zweite Klasse ebenfalls noch einsparen kann, bei zwei Farbzuständen wird nur eine Klasse benötigt.

              Cü,

              Kai

              --
              Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
              selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
              Mein Selfhtml-Kram
        2. Ist bei diesem Code $i=0; überhaupt notwendig?
          Es funktioniert auch ohne, kann aber auch an meinen Einstellungen liegen.

          1. Ok, hat sich erledigt. das erzeugt bei reporting all einen Fehler.

            1. echo $begrüßung;

              Ok, hat sich erledigt. das erzeugt bei reporting all einen Fehler.

              Der lesende Zugriff auf nicht initialisierte Variablen ist aus PHP-Sicht kein Fehler sondern nur eine Notiz wert, es ist noch nicht mal eine Warnung. Aus Anwendungssicht kann das aber fatale Folgen haben. Man könnte übersehen haben, dass man diese Variable in einam vorhergehenden Programmteil schon einmal verwendet hat, dann hat man da einen anderen Wert drinstehen und bekommt nicht nur das übliche null. Im Zusammenhang mit register_globals=On besteht auch die Möglichkeit, dass jemand durch einen ungewünscht gesetzten GET/POST/Cookie-Parameter die Variablen vorbelegt.

              Es ist immer eine gute Idee, Variablen definiert zu initialisieren, auch wenn das auf den ersten Blick als nicht notwendig erscheint.

              echo "$verabschiedung $name";