[php] Tabellenfarben automatisch abwechseln



  • Hallo!

    Ich wollte meine Daten aus meiner Mysql auslesen und in einer Tabelle auflisten.
    Die Tabelle soll aber immer automatisch die farben abwechseln.

    Beispiel:

    Inhalt1 (Grün)
    Inhalt2 (Gelb)
    Inhalt3 (Grün)
    Inhalt4 (Gelb)

    Ich weiß aber nicht wie das gehen soll/könnte.

    Kann mir da jemand helfen?

    Gruß
    Wubbel



  • <table><?php
    $colors=Array('#00ff00','#ffff00');
    $row=true;
    for ($i=0;$i<MAX;++$i)
    {
      $row=!$row;
      print "<tr bgcolor=\"".$colors[(int)$row]."\"><td>Value1</td></tr>\n";
    }?></table>
    

    Musst du natürlich deinen Bedürfnissen entsprechend verändern.


  • Mod

    ohne true/false - was sehr irreführend ist, geht es mit Modulo:

    §row++;
    row=row=row%2;



  • Nunja... Aber nehmen wir mal an er hat 500000 Datensätze, soll alle untereinander darstellen... was geht schneller? Einen Bool-Wert umzuschalten oder aufwärtszählen und erst noch den Modulator verwenden? Die Rechenoperation, die am längsten braucht ist definitiv die Division - worauf der Modulator beruht. Also ich würde dir empfehlen, einfach nen Bool-wert zu verwenden, auch wenn es "irreführend" ist.



  • 1.) Ich kann mir nicht vorstellen, dass es sinnvoll wäre 500.000 Datensätze untereinander auf einer Setie auszugeben :p

    2.) Als Variable für sein Modulo kann er ja direkt seine Zähl-Variable aus der Schleife, also $i, verwenden 🙂



  • Und zum einfärben am besten noch CSS. Dann braucht man auch nicht zwingend ein Array:

    <table><?php
    for ($i=0;$i<MAX;++$i)
    {
      print "<tr class=\"farbe" . $i%2 . "\"><td>Value1</td></tr>\n";
    }?></table>
    


  • Wie gesagt: Tu dir selbst einen Gefallen und nimm kein Modulo-Operator, nimm ne Bool-variable, irretiert vielleicht, ist aber bei vielen Datensätzen viel schneller, aber das mit den Stylesheets ist echt ne gute Idee, geht noch schneller *g*

    <table><?php
    $b=true;
    for ($i=0;$i<MAX;++$i)
    {
      $b=!$b;
      print "<tr class=\"farbe" . (int)$b . "\"><td>Value1</td></tr>\n";
    }?></table>
    


  • Zeig mir bitte mal einen Code, bei dem deine Variante schneller sein soll - bei mir ist es wenn dann gerade umgekehrt :p



  • Gut, erstelle 2 Dateien, in der ersten:

    <table><?php
    $b=true;
    for ($i=0;$i<10000;++$i)
    {
      $b=!$b;
      print "<tr><td class=\"farbe".$b."\">Value</td></tr>\n";
    }?></table>
    

    Und dann noch die zweite:

    <table><?php
    for ($i=0;$i<10000;++$i)
    {
      print "<tr><td class=\"farbe".$i%2."\">Value</td></tr>\n";
    }?></table>
    

    Na, welche ist schneller fertig? Das erklärt sich schon aus dem Logischen: Einen Zustand von 0 zu 1 und umgekehrt zu ändern geht schneller, als andauernd zu dividieren und zu sehen, bleibt da jetzt wenn man es durch 2 teilt ein rest übrig, oder nicht? - Denn den Zustand muss er erstnoch herausfinden, bei einer Bool-variable kennt er den Zustand schon.



  • Sorry, aber bei mir ist der 2. Code fast doppelt so schnell :p
    Find ich eigentlich auch logisch, denn man spart sich eine Zuweisung und einen cast 🕶


  • Mod

    Windoof schrieb:

    Wie gesagt: Tu dir selbst einen Gefallen und nimm kein Modulo-Operator, nimm ne Bool-variable, irretiert vielleicht, ist aber bei vielen Datensätzen viel schneller

    Also bei vielen Datensätzen ist der Flaschenhals wohl das auslesen der Daten, weiters das versenden der Tabellen an den Client und dann noch das Rendern der Tabelle.

    Und das ein bool mit cast nach int wesentlich schneller ist als ein modulo müsstest du mir erst beweisen.

    Mein code ist nicht nur sauberer, verständlicher und schöner, sondern auch erweiterbarer -> zB problemlos auf 3 oder mehr Farben.

    Weiters kann man die Laufvariable dazu verwenden, was wieder speicher spart :p



  • Achja, jetz weiß ichs, danke für den Tipp... Das casten ist es, was den Boolean auf einmal so langsam macht... Also robiers mal so:

    <table>
    <?php
    $b=true;
    for($i=0;$i<10000;++$i)
    {
    $b=!$b;
    print "<tr><td class=\"farbe".$b."\">Value</td></tr>\n";
    }?></table>
    

    So, allerdings müssen die Klassen dann nicht farbe0 und farbe1, sondern farbetrue und farbefalse heoßen, aber das ist ja egal.



  • Jetzt ist es minimal schneller, aber das sind Zeitersparnisse im ms-Bereich (auf 10.000 Durchläufe) 🕶
    Also ich finde, dass sich dieser Vorteil angesichts des Verlusts an Übersichtlichkeit und Flexibilität absolut nicht lohnt 🙂



  • @Windoof: Erklär doch mal, was du erreichen willst. Der Geschwindigkeitsunterschied ist zu klein, um relevant zu sein. Dein Ansatz ist unflexibel und schwer verständlich. Trotzdem beharrst du darauf, das das ganz toll sei.



  • Helium schrieb:

    Dein Ansatz ist unflexibel und schwer verständlich.

    Hä? Was ist daran unverständlich? Er schaltet eine Bool-variable ständig zwischen true und false... was soll daran unverständlich sein? Also wirklich, da ist der Modulo-Operator unverständlicher. 🙄 Ich gebe zu, der Wuelltext von mir ist genau 2 Zeilen länger, aber immer nur 2 Zeilen. 😮

    Trotzdem beharrst du darauf, das das ganz toll sei.

    Ja, denn das waren jetzt "nur" 10000 Durchläufe, wo nix anderes Passiert. Aber stell dir mal vor, du hättest 5000000 Durchläufe, da gehts schonwieder um ganze Sekunden, die echt wichtig sein können. 🕶



  • 😮 also ich finds ja nett, dass Ihr mir helfen wollt, aber jetzt habt Ihr mich durcheinander gebracht.
    Was soll ich denn jetzt nehmen (was ist das beste & einiger maßen schnellste)?



  • Du willst das schnellere? Nimm das mit der Bool-Variable... 🙂 Wenn du den Code nehmen willst, der zwar um ganze 2 Zeilen kürzer ist, aber nicht ganz so schnell ist, nimm den mit dem Modulo-Operator.



  • Nimm die Variante mit dem Modulo - ist flexibler und "schöner" 🙂


  • Mod

    Windoof schrieb:

    Du willst das schnellere? Nimm das mit der Bool-Variable... 🙂 Wenn du den Code nehmen willst, der zwar um ganze 2 Zeilen kürzer ist, aber nicht ganz so schnell ist, nimm den mit dem Modulo-Operator.

    Zeig mir ein Benchmark Ergebnis wo deine Variante (man beachte die " anstatt der ') schneller ist, als meiner. Und mit schneller meine ich Messbar schneller.

    Bei flenders Test ist rausgekommen, das deine Variante langsamer ist. Also bist du dran zu beweisen, dass du im Recht bist.



  • Also bei der bool-Variante muss er jedesmal einen String aus dem Warheitswert generieren, was eine bedingung beinhaltet. Und wenn dir Modulo zu langsam ist, dann benutze ein $i&1.


Anmelden zum Antworten