Danny: Ausgabe auf 2 Listen verteilen

Hallo,

brauche dringend Hilfe. Ich habe in einer MySql 12 Felder für Farben. Der Zustand der Felder ist 1 oder 0. Nun möchte ich wenn z.B. 5 Farben den Wert 1 haben diese auf 2 Listen (<ul>) verteilen.

Leider klappt mein Ansatz nicht...

  
$z_label = array(  
'z_1' => 'Farbe_1',  
'z_2' => 'Farbe_2',  
'z_3' => 'Farbe_3',  
'z_4' => 'Farbe_4',  
'z_5' => 'Farbe_5',  
'z_6' => 'Farbe_6',  
'z_7' => 'Farbe_7',  
'z_8' => 'Farbe_8',  
'z_9' => 'Farbe_9',  
'z_10' => 'Farbe_10',  
'z_11' => 'Farbe_11',  
'z_12' => 'Farbe_12'  
);  
  
// Wieviele z_XXXX Felder gibt's in der DB?  
  
$z_db_count = 12; // beispielsweise 12  
  
$z_present = array();  
for($i = 0; $i < $z_db_count; $i++)  
{  
    $current_var = 'z_' . ($i+1);  
    $tmp = '';  
    eval('$tmp = $ausgabe->' . $current_var . ';');  
    if($tmp <> '' && $tmp <> NULL)  
    {  
       $z_present[] = $current_var;  
    }  
  
}  
  
for($i = 0; $i < count($z_present); $i++)  
{  
  
echo "<ul id=\"a\">";  
echo "<li>".$z_label[$z_present[$i]]."</li>";  
  
$i++;  
  
if(count($z_present) % 2 == 1 && $i >= (count($z_present) - 1))  
echo "&nbsp;";  
else  
echo "<li>".$z_label[$z_present[$i]]."</li>";  
  
echo "</ul>";  
}  

Die Ausgabe sollte, bei 5 Werten mit 1 so aussehen (Nur Beispielfarben!):

  
<ul id="a">  
<li>Farbe_2</li>  
<li>Farbe_3</li>  
<li>Farbe_5</li>  
</ul>  
  
<ul id="b">  
<li>Farbe_7</li>  
<li>Farbe_9</li>  
</ul>  

Wichtig ist das die Ausgabe auf 2 "<ul>" aufgeteil wird weil diese nebeneinander platziert werden sollen.

Hoffe mir kann und will wer helfen.

Grüssle

  1. Hi,

    Wichtig ist das die Ausgabe auf 2 "<ul>" aufgeteil wird weil diese nebeneinander platziert werden sollen.

    Klingt unsinnig.

    Floate die LI oder lasse sie als inline(-block) darstellen, und vergebe eine passende Breite für die(!) Liste, so das jeweils zwei LI nebeneinander passen.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      klingt unsinnig-ist es aber nicht. Ich muss sie auf 2 Listen aufteilen.
      Daher freue ich mich über Hilfe.

      Grüssle

      1. Hi,

        klingt unsinnig-ist es aber nicht. Ich muss sie auf 2 Listen aufteilen.

        Warum?

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hallo ChrisB,

          Die Ausgabe muss (!) in 2 Tabellen ausgegeben werden.
          Kein Tabellen-Layout sondern eine Tabellendarstellung.

          Also eine Idee für mich?

          1. hi,

            Also eine Idee für mich?

            Eine passende Listen-Variante -- in deinem Fall wäre eine http://de.selfhtml.org/html/text/listen.htm#definition@title=Definitionsliste wohl am geeignetsten.

            mfg

          2. Hi,

            Die Ausgabe muss (!) in 2 Tabellen ausgegeben werden.
            Kein Tabellen-Layout sondern eine Tabellendarstellung.

            Erst redest du von  Listen, jetzt von Tabellen - ja was denn nu?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. Lies doch einfach meine Frage und sag mir ob du mir helfen kannst oder nicht-muss ich denn alles erklären warum ich es so brauche?

              Es MUSS in 2 <ul> ausgegeben werden.

              1. Hi,

                Lies doch einfach meine Frage und sag mir ob du mir helfen kannst oder nicht

                Ja, ich kann dir helfen - in dem ich dir von Unsinn abrate.

                -muss ich denn alles erklären warum ich es so brauche?

                Wenn du nicht willst, dass es wie aus Unerfahrenheit im Umgang mit HTML und CSS erwachsener Unsinn klingt, dann wäre das besser, ja.

                Es MUSS in 2 <ul> ausgegeben werden.

                Liefere statt Worten in Grossbuchstaben doch bitte ENDLICH mal eine schlüssige Begründung für diese Behauptung.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. Hallo ChrisB,

                  Unsinn ist deine "Idee".
                  Wenn ich die <li> floate bekomme ich nicht die Reihenfolge die ich haben möchte.

                  Aber besten Dank.

                  1. Hi,

                    Wenn ich die <li> floate bekomme ich nicht die Reihenfolge die ich haben möchte.

                    Dann hättest du vielleicht klar spezifizieren sollen, welche Reihenfolge du überhaupt möchtest - das war aus deiner Frage nicht explizit zu entnehmen.

                    MfG ChrisB

                    --
                    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                    1. Hi!

                      Wenn ich die <li> floate bekomme ich nicht die Reihenfolge die ich haben möchte.

                      Dann hättest du vielleicht klar spezifizieren sollen, welche Reihenfolge du überhaupt möchtest - das war aus deiner Frage nicht explizit zu entnehmen.

                      Ich habe OP so verstanden, dass die erste Hälfte der Erbnismenge links, die zweite rechts stehen soll. Dazu muß man eben vorher die Ergebnisse umsortieren ..

                      off:PP

                      --
                      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
              2. hi,

                Es MUSS in 2 <ul> ausgegeben werden.

                jetzt verstehe ich dein anliegen.

                Ganz einfach:

                1. Definiere eine Mindestzahl, ab wann die Liste geteilt werden soll
                2. Zähle, wieviele Elemente das array hat (hier dann auch die bedingungen für die Schleife setzen, die folgt)
                3. Jage das Ergebnis durch eine for-Schleife -- wenn aufgrund der Anzahl der Array-Elemente benötigt, dann halt 2 mal

                mfg

                1. Hallo,

                  das habe ich jetzt gemacht-aber es klappt noch nicht "richtig":

                    
                  echo "<ul>\n";  
                  for($i = 0; $i < count($z_present); $i++)  
                  {  
                    
                  echo "<li>".$z_label[$z_present[$i]]."</li>\n";  
                  $i++;  
                    
                  if($i >= round(count($z_present) / 2))  
                  {  
                  echo "</ul>\n\n<ul>\n";  
                  }  
                  echo "<li>".$z_label[$z_present[$i]]."</li>\n";  
                  }  
                  echo "</ul>\n";  
                  
                  

                  Das Ergebnis sieht so aus:

                    
                  <ul>  
                  <li>Farbe_1</li>  
                  <li>Farbe_2</li>  
                  <li>Farbe_3</li>  
                  </ul>  
                    
                  <ul>  
                  <li>Farbe_4</li>  
                  <li>Farbe_5</li>  
                  </ul>  
                    
                  <ul>  
                  <li></li>  
                  </ul>  
                  
                  

                  Grüssle

                  1. Napaykullayki!

                    das habe ich jetzt gemacht-aber es klappt noch nicht "richtig":

                    Zwei Fehler fallen mir auf Anhieb auf:
                    0. Du gibst zwei Elemente pro Schleifendurchlauf aus, wobei Du zwischendrin den Counter inkrementierst, ohne dabei zu überprüfen, ob es überhaupt noch ein Element gibt. Kümmere Dich lieber jeweils nur um eines.
                    1. Die Bedingung if($i >= round(count($z_present) / 2)) trifft nicht nur für das erste Element nach der Hälfte zu, sondern für jedes weitere. Berechne lieber schon vor der Schleife, bei welchem die Sonderbehandlung eintreten soll, merke Dir dessen Index und frage den dann in der Schleife ab.

                    Viele Grüße vom Længlich

                    --
                    Mein aktueller Gruß ist:
                    Quechua Cuzqueño (gesprochen in Cuzco [Perú])
                    1. Napaykullayki!

                      das habe ich jetzt gemacht-aber es klappt noch nicht "richtig":

                      Zwei Fehler fallen mir auf Anhieb auf:
                      0. Du gibst zwei Elemente pro Schleifendurchlauf aus, wobei Du zwischendrin den Counter inkrementierst, ohne dabei zu überprüfen, ob es überhaupt noch ein Element gibt. Kümmere Dich lieber jeweils nur um eines.

                      1. Die Bedingung if($i >= round(count($z_present) / 2)) trifft nicht nur für das erste Element nach der Hälfte zu, sondern für jedes weitere. Berechne lieber schon vor der Schleife, bei welchem die Sonderbehandlung eintreten soll, merke Dir dessen Index und frage den dann in der Schleife ab.

                      Viele Grüße vom Længlich

                      Hallo,

                      wenn ich wüsste wie das geht würde ich hier ja nicht schreiben ;-)

                        
                      $x =  round(count($z_present) / 2);  
                        
                      echo "<ul>\n";  
                      for($i = 0; $i < count($z_present); $i++)  
                      {  
                        
                      echo "<li>".$z_label[$z_present[$i]]."</li>\n";  
                      $i++;  
                        
                      if($i >= $x)  
                      {  
                      echo "</ul>\n\n<ul>\n";  
                      }  
                        
                      echo "<li>".$z_label[$z_present[$i]]."</li>\n";  
                        
                      }  
                        
                      echo "</ul>\n";  
                      
                      

                      Grüssle

                      1. hi,

                        Quick&Dirty (kleiner Denkansatz)

                        $z_present = array(  
                           1 => 'eins'  
                          ,2 => 'zwö'  
                          ,3 => 'droa'  
                          ,4 => 'viea'  
                          ,5 => 'funf'  
                          ,6 => 'seck`s'  
                          ,7 => 'sieba'  
                        );  
                          
                        $x =  round(count($z_present) / 2);  
                        $max = 3;  // Max. Elemente im ersten Block  
                          
                        for($i = 1; $i <= $max; $i++)  
                          echo "<li>First Block - " . $z_present[$i] . "</li>\n";  
                        /*  
                         *  Zweiter Block, wenn bedingung erfüllt wird (Array > max)  
                         */  
                        if(count($z_present) > $max)  
                          for($i = ++$max; $i <= count($z_present); $i++)  
                            echo "<li>Second Block - " . $z_present[$i] . "</li>\n";  
                        
                        

                        mfg

                        1. Hallo und vielen Dank!

                          klappt aber auch nicht...

                          Grüssle

                          1. hi,

                            klappt aber auch nicht...

                            Was genau klappt nicht? Bei mir ist die Augabe des Script

                            First Block - eins
                            First Block - zwö
                            First Block - droa
                            Second Block - viea
                            Second Block - funf
                            Second Block - seck`s
                            Second Block - sieba

                            Wie sieht es bei dir aus?

                            mfg

                            1. Kuambilu!

                              klappt aber auch nicht...

                              Was genau klappt nicht?

                              Ich fürchte, die Sache mit dem _Denk_ansatz …

                              @Danny: Hast Du versucht, Malcolms Ansatz zu verstehen, oder hast Du ihn bloß übernommen?
                              Kurz: Kapiert oder kopiert? :D

                              Selbe Frage bzgl. dessen, was ich geschrieben hatte: Der Hinweis, die Berechnung besser am Anfang vorzunehmen, ist der einzige, den Du umgesetzt hast – die anderen Fehler bestehen in Deinem Posting danach unverändert. Und ausgerechnet dieser kleine Hinweis war eigentlich kein Fehler; vielmehr hast Du damit nur die Performance verbessert, aber nichts am Verhalten geändert.

                              Schau Dir bitte nochmal Malcolms Script an, und insbesondere dessen Unterschiede zu Deinem. Wenn Du den Ansatz verstehst, kannst Du Deins leicht anpassen. Wenn nicht, kannst Du uns dadurch zumindest eine bessere Problembeschreibung liefern als »klappt nicht«.

                              Viele Grüße vom Længlich

                              --
                              Mein aktueller Gruß ist:
                              Laadi (gesprochen im Congo)
                              1. Kuambilu!

                                Salām

                                Was genau klappt nicht?
                                Ich fürchte, die Sache mit dem _Denk_ansatz …

                                Das denke ich auch.

                                Kurz: Kapiert oder kopiert? :D

                                Wobei letzteres ja Suboptimal für den OP wäre, da mein Bsp. alles ist, nur nicht gut ;)

                                mfg

    2. Hallo Chris,

      Wichtig ist das die Ausgabe auf 2 "<ul>" aufgeteil wird weil diese nebeneinander platziert werden sollen.
      Klingt unsinnig.

      ja, ist es semantisch gesehen auch. Trotzdem wegen der Unzulänglichkeiten von HTML/CSS nötig.

      Floate die LI oder lasse sie als inline(-block) darstellen, und vergebe eine passende Breite für die(!) Liste, so das jeweils zwei LI nebeneinander passen.

      Damit bekommst du die List Items zwar in zwei Spalten angeordnet, jedoch nicht spaltenweise sortiert, was man bei dieser Anordnung aber erwarten würde.
      Echter Spaltensatz mit automatischem Spaltenausgleich ist halt in CSS nicht vorgesehen. :-(

      Ciao,
       Martin

      --
      Man ist so alt, wie man sich fühlt.
      Aber niemals so wichtig.
      1. Hi Martin!

        Floate die LI oder lasse sie als inline(-block) darstellen, und vergebe eine passende Breite für die(!) Liste, so das jeweils zwei LI nebeneinander passen.

        Damit bekommst du die List Items zwar in zwei Spalten angeordnet, jedoch nicht spaltenweise sortiert, was man bei dieser Anordnung aber erwarten würde.

        Man kann aber doch _vor_ der Ausgabe die Ergebnisemenge umsortieren.
        Also: Ergebnismenge teilen und dann abwechselnd aus jeder Teilmenge ein Element in die Liste einfügen.

        Oder was verstehe ich gerade nicht?

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      2. Chào bạn!

        Echter Spaltensatz mit automatischem Spaltenausgleich ist halt in CSS nicht vorgesehen. :-(

        Doch, vorgesehen schon: http://www.w3.org/TR/css3-multicol/
        Firefox kann es mit -moz: https://developer.mozilla.org/en/CSS3_Columns
        Safari entsprechend mit -webkit, Opera afaik noch nicht, IE sicher nicht.

        Viele Grüße vom Længlich

        --
        Mein aktueller Gruß ist:
        Vietnamesisch
  2. Hi,

    brauche dringend Hilfe. Ich habe in einer MySql 12 Felder für Farben. Der Zustand der Felder ist 1 oder 0. Nun möchte ich wenn z.B. 5 Farben den Wert 1 haben diese auf 2 Listen (<ul>) verteilen.

    also einfacher ausgedrückt: Du willst eine gegebene Zahl von li-Elementen in zwei Spalten anordnen.

    for($i = 0; $i < count($z_present); $i++)
    [...]
    $i++;

    Es ist selten eine gute Idee, die Schleifenvariable innerhalb der Schleife direkt zu verändern. Wenn man nicht *ganz genau* weiß, was man tut, sollte man das lieber lassen. Mir ist auch nicht klar, wozu das hier gut sein soll.

    if(count($z_present) % 2 == 1 && $i >= (count($z_present) - 1))

    Die Bedingung kann -wenn du das Erhöhen der Schleifenvariablen von Hand mal weglässt- nie zutreffen.

    Die Ausgabe sollte, bei 5 Werten mit 1 so aussehen (Nur Beispielfarben!):

    <ul id="a">

    <li>Farbe_2</li>
    <li>Farbe_3</li>
    <li>Farbe_5</li>
    </ul>

    <ul id="b">
    <li>Farbe_7</li>
    <li>Farbe_9</li>
    </ul>

      
    Du möchtest einfach, wenn $i die halbe Anzahl (aufgerundet) erreicht hat, die Tags "</ul><ul>" ausgeben. Wenn's im Quellcode schön aussehen soll, auch noch einen Zeilenumbruch zwischen diesen beiden Tags.  
      
    Ciao,  
     Martin  
    
    -- 
    Rizinus hat sich angeblich als sehr gutes Mittel gegen Husten bewährt.  
    
    
    1. Hallo Martin,

      genau das was du schreibst meine und möchte ich-weiss nur nicht wie...
      Bin leider noch Anfänger.

      Grüssle

      1. Hi,

        Du möchtest einfach, wenn $i die halbe Anzahl (aufgerundet) erreicht hat, die Tags "</ul><ul>" ausgeben.

        genau das was du schreibst meine und möchte ich-weiss nur nicht wie...

        Eine Zahl durch zwei dividieren zu lassen, bekommst du hin?
        Eine Dezimalzahl aufrunden zu lassen, bekommst du hin?
        Eine Ausgabe abhängig von einer Bedingung zu machen, bekommst du hin?

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]