Objekt nach der Datenbankid einfärben

  • Hey zusammen,


    ich habe folgende Tabelle:

    objektId objektname eigenschaften
    1000 objekt1 test1
    1000 objekt1_1
    test1_2
    1001 objekt2 test2
    1001 objekt2_1 test2_1


    usw...


    Nun möchte ich, dass von jeder Id alle Ausgaben ab der 2 ten Id eingefärbt werden. Das heißt, dass das erste Objekt bei der Id 1000 nicht eingefärbt wird sondern erst das zweite Objekt des ersten. Und dies mit jeder Id.


    Ich habe mir viele Gedanken darüber gemacht. Und kam so zum Gruppenbruch. Jedoch liegt da für mich das Problem, dass jede Id eine andere Farbe haben muss und die Id nicht so wie in der Datenbank steht ausgegeben wird. Es wird anstatt zweimal 1000 die Id immer hochgezählt ( 1001 , 1002 ,1003, ..), was ich nicht verstehe. Zusätzlich habe ich noch ein Array mit Classennamen erstellt welche dann dynamisch mit shuffle zugeordnet werden. Dies klappt auch nicht so gut weil es immer vorkommen kann, dass auch mal gleiche Klassen ausgegeben werden.


    Kann mir jemand sagen, warum die objektId immer um 1 erhöht wird?

    Auch habe ich mir überlegt alle Ids aus der Datenbank zu fetchen, was doch ein sehr großer Aufwand bei jeder Ladung der Seite ist, diese in ein Array zu packen und dann nach und nach die Array Werte mit den gezogenen Ids zu vergleichen und dann die Klasse den Tags auch dynamisch zu geben. Und wenn die Id ungleich der Array-id ist wird die Array-Id aus dem Array entfernt und somit gehts weiter.


    Mein Problem ist, wie ich es hinbekomme, dass das erste Element der neuen Id nicht eingefärbt wird sondern erst das 2te.


    Das ist das Script dazu (Gruppenumbruch):

    Habt ihr denn Vorschläge und Ideen wie man es noch umsetzen kann?


    Grüße,

    Stef

  • Ich vermisse das else zu diesem if:

    Code
    if($id !== $data->objektId){

    D. h. Du erzeugst eine Tabellenzeile nur, wenn sich die ID ändert. Daher wird die ID scheinbar hoch gezählt, aber das liegt nur daran, dass die Zeilen, wo sich die ID wiederholt, gar nicht angezeigt werden.

  • Zitat

    Zusätzlich habe ich noch ein Array mit Classennamen erstellt welche dann dynamisch mit shuffle zugeordnet werden. Dies klappt auch nicht so gut weil es immer vorkommen kann, dass auch mal gleiche Klassen ausgegeben werden.

    Das ist das Wesen eines zufälligen Shuffle, dass das erste Element auch mal unverändert bleiben kann. Das kannst Du unterbinden, indem Du die Farben der Reihe nach auswählst durch Führen eine Index für das Array.

  • Natürlich ungetestet:

    PS: Wieso zerreißt dieses Forum eigentlich Leerzeichen im Quellcode. In Notepad++ sieht das alles besser aus.

  • Hey,


    Ich hatte einen Denkfehler.


    Mein oben gezeigtes Script tätigt nur im ersten Durchlauf die Ausgabe weil dann dien Id nicht ungleich der objektId ist.


    Da musste ich nun nurnoch im Else Block die anderen Reihen ausgeben.


    Weil die erste Ausgabe bei einer neuen Id eh immer in das If springt muss ich die Klasse nur der Ausgabe im Else-Block geben.


    Ich habe nun noch etwas getestet und kam auf eine Lösung welche sehr leicht war. Diese werde ich morgen noch Posten.


    Sempervivum :


    Wie meinst du denn das? Wie soll ich denn die Farben durch den Index ausgeben ?


    Meinst du damit, dass wenn man weis wie viel Klassen vorhanden sind nach jedem Durchgang eine Variable hochzählt und wenn der Wert dieser Variable gleich der Summe aller vorhandenen Keys ist diese Variable wieder zurückgesetzt wird und von neu anfängt hochzuzählen?


    m.scatello :


    Danke für den Lösungsvorschlag. Ich habe nur gehofft nicht sofort sowas zu bekommen. Ich möchte sehr gerne selbst nachdenken und mittels Tipps das Ziel erreichen.


    Den Lösungsvorschlag werde ich mir morgen anschauen.


    Grüße,

    Stef

  • Zitat

    Meinst du damit, dass wenn man weis wie viel Klassen vorhanden sind nach jedem Durchgang eine Variable hochzählt und wenn der Wert dieser Variable gleich der Summe aller vorhandenen Keys ist diese Variable wieder zurückgesetzt wird und von neu anfängt hochzuzählen?

    Ja, so habe ich es gemeint. Diese Variable gibt den Index (Key) im Array an.


    Zitat

    Mein oben gezeigtes Script tätigt nur im ersten Durchlauf die Ausgabe weil dann dien Id nicht ungleich der objektId ist.


    Da musste ich nun nurnoch im Else Block die anderen Reihen ausgeben.

    Genau das hatte ich in Posting #2 gemeint.

  • Guten Morgen,


    okay. Ich habe es nun mal ausprobiert und es klappt super.


    Das ist meine Lösung:


    m.scatello : Dein Lösungsvorschlag macht im Prinzip das gleiche wie meine Lösung. Ich finde es gut mal andere Lösungswege zu sehen.


    Eine Frage habe ich zu deinem Script noch. Dort zählst du $i hoch und benutzt den modulo zu count($classes). Warum machst du es denn so?

    Erfüllt es nicht, wenn man $i nur hochzählt, die gleiche Funktion ?


    Grüße,

    Stef

  • Eine Frage habe ich zu deinem Script noch. Dort zählst du $i hoch und benutzt den modulo zu count($classes). Warum machst du es denn so?

    Erfüllt es nicht, wenn man $i nur hochzählt, die gleiche Funktion ?

    Damit spare ich mir das hier:

    Code
    if($classId == count($classes)){
       $classId = 0;
  • Okay. Verstehe ich gerade nicht.


    Modulo nimmt ja eine Zahl geteilt durch die andere und hat als Ergebnis den Rest.


    Es gibt da folgende Rechnungen dann:

    1. 0 % 3 = 0

    2. 1 % 3 = 1 -> Warum ist 1 der Rest ? 1 / 3 ist 0.33333. Dann wird doch abgerundet und nicht aufgerundet?

    3. 2 % 3 = 2 -> hier das gleiche. Verstehe ich nicht. Habe mir dazu eben die Berechnung angeschaut. Aber daraus werde ich mittels dieser Rechnung auch nicht schlauer.

    4: 3 % 3 = 0 -> 3 / 3 = 1 Rest 0. Denn 1x3 ist wieder 3.


    Somit fängt das alles wieder von vorne an.

  • Bist Du sicher, dass deine Lösung aus #7 richtig funktioniert? Ich habe es zwar nicht getestet, aber im Code vermisse ich das else. So erwarte ich, dass im Falle dass sich die ID ändert, die betr. Zeile doppelt ausgegeben wird?

  • Hey

    Bist Du sicher, dass deine Lösung aus #7 richtig funktioniert? Ich habe es zwar nicht getestet, aber im Code vermisse ich das else. So erwarte ich, dass im Falle dass sich die ID ändert, die betr. Zeile doppelt ausgegeben wird?

    Ja. Der else-Block wird ja nach dem if ausgeführt. So kann man das ja auch schreiben ohne jedesmal nach dem if{} ein else{} zu schreiben. Oder liege ich da falsch?


    Ich habe eben nochmal nachgeschaut. Und du hast Recht. Es wird die betroffene Zeile doppelt ausgegeben. Warum ist das denn so?


    m.scatello :


    Ich habe mal das Script ausgeführt. Dort wird immer in der gleichen Reihenfolge 0 , 1 , 2 ausgegeben. Langsam glaube ich es zu verstehen.

    Danke.


    Grüße,

    Stef

  • Zitat

    So kann man das ja auch schreiben ohne jedesmal nach dem if{} ein else{} zu schreiben.

    Schreiben kann man es so, aber das Ergebis ist nicht das, was Du beabsichtigst, weil dann der Code nach der schließenden geschweiften Klammer des if unbedingt und unabhängig vom Ergebnis des if ausgeführt wird.

  • Nur mal als Anregung, man muss nicht die Ausgabe komplett wiederholen, wenn sich nur ein einziger Parameter ändert.

    Angenommen ich bereite meine Ausgabe in einer Variablen vor:

    PHP
    $sHtmlTableRow =<<<EOHTML
    <tr>
        <td><a class="#CSSCLASS#" href="objekt.php?objektId=#OBJID#">#OBJID#</a></td>
        <td>#OBJNAME#</td>
        <td>#OBJPROPS#</td>
    </tr>
    EOHTML;

    Dann benötige ich lediglich eine ternäre Operation für die Entscheidung, ob die Zeile eingefärbt wird oder nicht:

    ungetestet, aber sollte so in etwa hinhauen...

  • Hey,


    ich habe es mal getestet.


    Da wird jedesmal folgende Fehlermeldung angezeigt: Parse error: syntax error, unexpected end of file


    Das heißt, dass der PHP-Block nicht richtig geschlossen wurde. Ich habe nun alles durchschaut aber daran kannst nicht liegen. Nun habe ich die Tabellenstruktur herausgenommen und der Fehler wird nicht mehr angezeigt.


    Warum ist das denn so ?

  • Hey,


    der Code sieht wie folgt aus:


  • Das Highlightning ist vermutlich nur hier im Editor fehlerhaft.

    Solange das schließende EOHTML; keine Einrückung hat, sollte das technisch kein Problem geben.


    Allerdings dürfte es Probleme mit dem Heredoc in Bezug auf die DoubleQuotes geben, fällt mir gerade auf.

    Evtl. mal mit der Nowdoc-Syntax testen:

    PHP
    $sHtmlTableRow =<<<'EOHTML'
    <tr>
        <td><a class="#CSSCLASS#" href="db_verlauf.php?objektId=#ID#">#ID#</a></td>
        <td>#OBJEKT#</td>
        <td>#PREIS#</td>
        <td>#EIGENSCHAFTEN#</td>
        <td>#ANGEBOT#</td>
    </tr>
    EOHTML;

    Sollte das nicht helfen, musst Du die DoubleQuotes innerhalb der des String maskieren.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!