Sebastian Becker: mehrspaltige Liste mit PHP automatisch erzeugen

Hallo,

ich habe ein kleines Skript zum erzeugen einer mehrspaltigen Liste geschrieben. Vielleicht kann jemand etwas damit anfangen ...

Alle Listenelemente werden dabei als Argumente übergeben.

Jetzt überlege ich, wie ich die Funktion weiter sinnvoll verbessern kann und insbesondere auch Werte für die Spaltenanzahl und Reihenfolge als Argumente übergeben kann.

Für Ideen und Kommentare bin ich dankbar.

Grüße,

Sebastian

  1. <?php

    /* **********************************************************************
    make multicolumn list
    ********************************************************************** */
    function makeList()
    {
    global $classname;

    // define number of columns
    $numcols = 2;

    // define direction
    $horizontal = 0;

    // define table width in percent
    $tablewidth = 100;

    $numargs = func_num_args();
    $arg_list = func_get_args();

    $colwidth = floor($tablewidth/$numcols);

    // table
    echo "<table width="$tablewidth%" cellspacing="1" cellpadding="1" border="0" align="center">\n";
    echo "<tr>\n";

    // vertical direction
    if($horizontal==0)
    {
    // define items per column
    $colitems = ceil($numargs/$numcols);

    // define first and last item of first column
    $first =  0;
    $last = $colitems;

    // columns
    for($i=0;$i<$numcols;$i++) {
    echo "<td width="$colwidth%" class="$classname" vAlign="top">\n";
    echo "<ul>\n";

    // items
    for($j=$first;$j<$last;$j++)echo '<li>' . $arg_list[$j] . "</li>\n";

    // define first and last item of next column
    $first = $colitems*($i+1);
    $last=$colitems*($i+2)<$numargs?$colitems*($i+2):$numargs;

    echo "</ul>\n";
    echo "</td>\n";
    }
    }
    // horizontal direction
    else {

    // columns
    for($i=0;$i<$numcols;$i++) {
    echo "<td width="$colwidth%" class="$classname" vAlign="top">\n";
    echo "<ul>\n";

    // items
    for($j=$i;$j<$numargs;$j=$j+$numcols)echo '<li>' . $arg_list[$j] . "</li>\n";

    echo "</ul>\n";
    echo "</td>\n";
    }
    }

    // table
    echo "</tr>\n";
    echo "</table>\n\n";

    }

    // test
    makeList ('Feature 1','Feature 2','Feature 3','Feature 4','Feature 5','Feature 6','Feature 7','Feature 8','Feature 9','Feature 10','Feature 11');

    ?>

  2. Hallo,

    ich habe ein kleines Skript zum erzeugen einer mehrspaltigen Liste geschrieben.

    Ich kann mir unter "mehrspaltige Liste" nichts rechtes vorstellen.

    Dein Skript macht offenbar eine Tabelle, und schreibt dort
    dann jeweils in die Zellen eine (unverschachtelten) UL-Liste rein.
    Der Sinn des ganzen bleibt mir leider verborgen.
    Eine Liste ist doch etwas, was logisch zusammengehoert.

    Und wenn man sowieso zwei oder mehr Listen hat,
    kann man die doch auch mit CSS nebeneinander
    positionieren, anstatt dafuer Layouttabellen zu nehmen.

    Jetzt überlege ich, wie ich die Funktion weiter sinnvoll verbessern kann und insbesondere auch Werte für die Spaltenanzahl und Reihenfolge als Argumente übergeben kann.

    Die Daten wuerde ich von vornherein in einen Array schreiben,
    und dann diesen Array als Parameter an die Funktion weitergeben.
    Der Array kann auch mehrdimensional sein, und Du kannst ihn
    auch sortieren.

    Allgemein koenntest Du den Quellcode deutlich "huebscher" machen,
    wenn Du statt
    echo "<table width="$tablewidth%" cellspacing="1" cellpadding="1" border="0" align="center">\n";
    folgendes schreiben wuerdest:
    echo "<table width='$tablewidth%' cellspacing='1' cellpadding='1' border='0' align='center'>\n";
    In HTML sind einfache und doppelte Anfuehrungszeichen erlaubt.
    Nur bei Attributen, die moeglicherweise selbst ein einfaches Anfuehrungszeichen
    enthalten koennen, wuerde ich zum "Einpacken" das doppelte nehmen
    und mit " escapen.

    Noch schoener waere natuerlich der Verzicht auf all die
    veralteten Attribute und eine Gestaltung via CSS...
    echo "<table>\n";
    SCNR.

    ---

    Da wir gerade dabei sind, moechte ich meine kleine Funktion beisteuern,
    die aus einem Array eine beliebig verschachtelte UL-Liste macht.
    Natuerlich muss sie mit einem Punkt in der ersten "Einrueckungsebene"
    beginnen, und es darf (beim Ansteigen von oben nach unten) kein Punkt
    uebersprungen werden. (Beides scheint mir logisch.)

    function liste($levelstring,$htmlattribute="")
    /* Erwartet als erstes Argument ($levelstring) ein Array mit drei Feldern:
          Einrueckungs-Level, Inhalt, Attribut fuer das LI-Element.
       Das zweite, optionale Argument ($htmlattribute) wird als Attribut ins aeusserste
          UL-Element geschrieben.
       Die Funktion macht eine (verschachtelte) UL-Liste und gibt diese als String zurueck.
    */
    {
        $output="<ul$htmlattribute>\n";
        $anzmp=count($levelstring);
        for ($i=0;$i<$anzmp;$i++)
          {
             $level =  $levelstring[$i][0];
             $string = $levelstring[$i][1];
             $liattr = $levelstring[$i][2];
             $ii=$i;
             if ($i<$anzmp-1)
                $nextlevel=$levelstring[$i+1][0];
             else
                $nextlevel=1;
             $output.=str_repeat("    ",$level);
             $output.="<li$liattr>$string";
             if ($level==$nextlevel)
                { $output.="</li>\n"; }
             else
                {
                  while ($level<$nextlevel)
                    {
                      $output.="\n".str_repeat("    ",$level)."<ul>\n";
                      $level++;
                      if ($level<$nextlevel)
                         { $output.=str_repeat("    ",$level)."<li>"; }
                    }
                  while ($level>$nextlevel)
                    {
                      if ($level!=$levelstring[$i][0])
                        { $output.=str_repeat("    ",$level); }
                      $output.="</li>\n";
                      $output.=@str_repeat("    ",$level-1);
                      $output.="</ul>\n";
                      $level--;
                      if ($level==$nextlevel)
                         { $output.=str_repeat("    ",$level)."</li>\n"; }
                    }
                }
          }
        $output.="</ul>\n";
        return $output;
    }

    ---

    Alles mit str_repeat("    ",$level) dient nur der
    Einrueckung des HTML-Quelltexts und ist somit
    eigentlich Kosmetik...

    ---

    Beispiel:

    $listenarray[0][0]=1;    // Einrueckungstiefe
    $listenarray[0][1]="Punkt Eins";  // Inhalt
    $listenarray[0][2]="";   // ggf. Attribut fuer das LI-Element

    $listenarray[1][0]=2;
    $listenarray[1][1]="Punkt 1. a)";
    $listenarray[1][2]=" class='aktiv'";

    $listenarray[2][0]=2;
    $listenarray[2][1]="Punkt 1. b)";
    $listenarray[2][2]="";

    $listenarray[3][0]=1;
    $listenarray[3][1]="Punkt Zwei";
    $listenarray[3][2]="";

    $listenattribut=" class='navigation'";

    print(liste($listenarray,$listenattribut));

    ---

    Ergebnis (copy-paste, nicht nachbearbeitet;-):

    <ul class='navigation'>
        <li>Punkt Eins
        <ul>
            <li class='aktiv'>Punkt 1. a)</li>
            <li>Punkt 1. b)</li>
        </ul>
        </li>
        <li>Punkt Zwei</li>
    </ul>

    ---

    Vielleicht hilft die Funktion ja dem einen oder anderen.

    Gruesse,

    Thomas