schwarze Piste: umgekehrt ausgeben

Tachchen!

Ich kann noch immer nicht programmieren, bastele also noch immer an fremden
Codeschnipseln mit viel Zeit und selfphp/php.net herum. o_0

Aktuell möchte ich eine Liste von Links erstellen, die sich automatisch
erstellt aus den jeweils vorhandenen Ordnern in einem "Sammelordner".
Das stelle ich bislang wie folgt an.

<ul id="galerienliste">

<?php  
$ordner = "./galerien";  
$erstellen = opendir($ordner);  
while ($file = readdir ($erstellen)) {  
    if($file != "." && $file != "..") {  
        if(is_dir($ordner."/".$file)) {  
            $compl = $ordner."/".$file;  
            echo "<li><a href=\"".$compl."\">".$file."</a></li>\n";  
        }  
    }  
}  
closedir($erstellen);  
?>

</ul>

Dort benenne ich die Ordner nun nach dem Schema Jahr_Monat_Tag.
Das ist weder schön noch besonders elegant, aber es tut am Ende jedenfalls,
was ich gerne hätte.
Nur landet in dieser Liste natürlich der älteste Eintrag oben und der
neuste unten. Ich hätte es aber gerne genau umgekehrt.

Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!

Gruß

Die schwarze Piste

  1. Hallo,

    Nur landet in dieser Liste natürlich der älteste Eintrag oben und der
    neuste unten. Ich hätte es aber gerne genau umgekehrt.

    Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!

    Zwischenspeichern in einem Array, das sortieren, dann erst Links produzieren.

    Gruß

    jobo

    1. Tachchen!

      Zwischenspeichern in einem Array, das sortieren, dann erst Links produzieren.

      Hehe ... ja, sowas habe ich mir gedacht. ;-)
      Nein, ohne Spaß, wenn man nach "php sortieren" o.ä. sucht, findet man genau
      sowas und ich habe da alles durchforstet.

      ABER:
      Mein Posting hat schon eine so nebulöse Überschrift, weil ich weder weiß,
      was ein Array ist noch wie man es herstellt. Bis eben habe ich z.B. nur
      vermutet, dass meine Ausgabe kein Array ist.

      Die wirklich schönen Lösungen scheitern bei mir an Programmierbasics.
      Du wirst mir also im Zweifel auf die Sprünge helfen müssen bei den
      (für mich) ominösen Arrays ... wenn es keine andere Lösung gilt.

      Gruß

      Die schwarze Piste

      1. Die wirklich schönen Lösungen scheitern bei mir an Programmierbasics.
        Du wirst mir also im Zweifel auf die Sprünge helfen müssen bei den
        (für mich) ominösen Arrays ... wenn es keine andere Lösung gilt.

        Du könntest dich aber auch durch die Dokumentation von PHP "wühlen" und lernen was Arrays sind - die "Basics" zu erlernen bleibt dir nicht erspart.

      2. Hallo,

        Mein Posting hat schon eine so nebulöse Überschrift, weil ich weder weiß,
        was ein Array ist noch wie man es herstellt.»»
        Du wirst mir also im Zweifel auf die Sprünge helfen müssen bei den
        (für mich) ominösen Arrays ...

        Google kann dir sicher weiterhelfen.

        Stell dir ein Array als einen Aktenschrank vor.
        Auf den Schubfächern stehen z.B. jeweils ein Buchstabe aus dem Alphabet.
        In den Schubfächern können dann Akten sein die widerum sehr wahrscheinlich Inhalt haben.

        Es handelt sich, vereinfacht gesagt, also um eine Anordnung von Daten in Baumstruktur.
        Im Gegensatz zu einer Variablen der nur 1 Wert zugewiesen werden kann.

        Grüße, Matze

      3. hi,

        Mein Posting hat schon eine so nebulöse Überschrift, weil ich weder weiß,
        was ein Array ist noch wie man es herstellt.

        http://www.php.net/manual/de/function.scandir.php -- gibt dir ein Array zurück und ist recht Simpel.

        Das arbeiten mit Arrays macht Spass -- für mich waren die dinger damals auch sehr Furchteinflössend (mir wurde schon von der erwähnung eines Arrays Bibber und Bange), seitdem ich sie aber besser kennengelernt habe, mag ich sie sehr ;)

        mfg

        --
        --
        1. Tachchen!

          http://www.php.net/manual/de/function.scandir.php -- gibt dir ein Array zurück und ist recht Simpel.

          Zumindest bringt er mich einen Schritt weiter. Danke.
          Jetzt muss ich nur noch heute Abend mal in Ruhe überlegen, wie man damit
          eine sinnvolle Ausgabe hinbekommt. Und irgendwann wird sich sicher auch
          der Moment einstellen, wo mir Arrays als Konstrukt einleuchten. ;-)

          Gruß

          Die schwarze Piste

          1. hi,

            Und irgendwann wird sich sicher auch der Moment einstellen, wo mir Arrays als Konstrukt einleuchten. ;-)

            Es ist wirklich nicht schwer, machen wir ein Beispiel:

              error_reporting(E_ALL | E_STRICT);  
              header("content-type: text/plain");  
              
              // erstmal ein Array anlegen  
              $_myfirstarray = array(  
                                     'Name'     => 'schwarze'  
                                    ,'Nachname' => 'Piste'  
                                    ,'Beruf'    => 'Fotograf'  
                                    ,'Wohnort'  => 'iwo in Europa'  
                                    ,'Alter'    => 'Keine Ahnung ;)'  
                                    );  
              
              var_dump($_myfirstarray);   // Kontrollausgabe -- Das Array in Nackter Form  
              
              /*  
               * Das Array über eine Schleife in eine Liste schreiben  
              */  
              $_Liste = '';    // Variable initialisieren  
              foreach($_myfirstarray as $_Schluessel => $_Wert)  
              {  
                $_Liste .= "$_Schluessel = $_Wert\n";  // bei jedem durchlauf die neuen Werte an die Liste hängen  
              }  
              
              echo $_Liste;
            

            Wenn du dieses Beispiel verstehst, dürfte dir dein Vorhaben mit scandir() nicht schwer fallen.
            Vielleicht 10, höchstens 15 Zeilen Code (ohne Kommentare).

            mfg

            --
            --
            1. Tachchen!

              Wenn du dieses Beispiel verstehst, dürfte dir dein Vorhaben mit scandir() nicht schwer fallen.

              Vielen Dank für die Mühe!
              Ich habe gerade keine Zeit, werde mich aber heute Abend mit deinem Beispiel
              beschäftigen und auf jeden Fall Rückmeldung geben ... schlimmstenfalls mit
              dummen Rückfragen. ;-)

              Gruß

              Die schwarze Piste

              1. hi,

                schlimmstenfalls mit
                dummen Rückfragen. ;-)

                Passt schon.

                Immerhin besser als gar keine Reaktion, so wie von manch anderen fragenden hier ;)

                mfg

                --
                --
                1. Tachchen!

                  Also mal weiter im Text. Ein bisserl dümmer kann ich sicher noch aussehen. ;-)

                  Mein Ergebnis - sicher höchst unelegant - wäre bislang folgendes:

                    
                  $dir    = './galerien';  
                  $files = scandir($dir, 1);  
                    
                  $_Liste = '';  
                    
                    foreach($files as $_Schluessel => $_Wert)  
                    {  
                      $_Liste .= "<li><a href='" . "$_Schluessel = $_Wert" ."'>" . "$_Schluessel = $_Wert" . "</a></li>\n";  
                    }  
                    
                    echo $_Liste;  
                  
                  

                  Dabei stellen sich für mich einige Fragen:

                  1. $_Liste = ''; gibt es ausschließlich, damit man hinterher $_Liste
                  nutzen kann? Bewirkt '' irgendwas?

                  2. Ich verstehe auch nach x-fachem Lesen des Abschnitts in selfphp nicht,
                  was $_Schluessel = (oder =>) $_Wert mir sagen sollen/wollen?

                  3. Im Ergebnis habe ich aber vor allem in dem Array jeweils eine
                  "Nummerierung" (das ist bestimmt mehr als das, aber was?), wenn ich
                  den Array durch scandir erhalte und ihn nicht händisch vorher herstelle.
                  Was macht diese "Nummerierung" ... und wie bekomme ich sie aus meiner
                  Ausgabe heraus?

                  Gruß

                  Die schwarze Piste

                  1. Hi,

                    1. $_Liste = ''; gibt es ausschließlich, damit man hinterher $_Liste
                      nutzen kann? Bewirkt '' irgendwas?

                    Damit wir die Variable $Liste mit einem Leerstring initialisiert. An diesen Leerstring wird dann nachher in der Schleife das HTML für die einzelnen LI angehängen.
                    An eine zuvor nicht deklarierte Variable kannst du nichts anfügen - das würde PHP auch mit einer entsprechenden Warnung quitieren.
                    Der Leerstring ist zwar immer noch "nichts" - aber ein definiertes Nichts, und kein unbestimmtes.

                    1. Ich verstehe auch nach x-fachem Lesen des Abschnitts in selfphp nicht,
                      was $_Schluessel = (oder =>) $_Wert mir sagen sollen/wollen?

                    Meinst du in der foreach-Schleife?
                    Das erste Argument einer foreach-Schleife ist das, worüber du iterieren willst (meistens ein Array).
                    Jetzt brauchst du innerhalb der Schleife aber auch noch einen Bezeichner, über den du auf das aktuelle Element zugreifen kannst - den gibst du mit as an.

                    foreach($arrayVariable as $Wert) { ... }

                    • "für jedes" Element in $arrayVariable mache das folgende { ... }
                    • und stelle mir dabei den jeweils aktuellen Wert a(l)s $Wert zur Verfügung

                    Wenn du nicht nur mit jedem Wert was machen willst, sondern auch noch an dem Index, unter dem dieser Wert im Array hinterlegt ist, interessiert bist - dann nutzt du die erweiterte Syntax:

                    foreach($arrayVariable as $Schluessel => $Wert) { ... }

                    1. Im Ergebnis habe ich aber vor allem in dem Array jeweils eine
                      "Nummerierung" (das ist bestimmt mehr als das, aber was?),

                    Das ist einfach der nummerische, fortlaufende Index des Arrays.
                    Wenn du ein Array mit
                    $arrayVariable = array("abc", "def", "ghi");
                    anlegst - dann nummeriert PHP die Elemente automatisch, mit 0 beginnend.

                    Wenn du das mittel print_r() zur Kontrolle ausgeben lässt, dann bekommst du folgendes zu sehen:

                    Array
                    (
                        [0] => abc
                        [1] => def
                        [2] => ghi
                    )

                    Die Ziffern von 0 bis 2 sind der nummerische Index, über den du gezielt auf einzelne Elemente des Arrays zugreifen kannst.
                    echo $arrayVariable[1]; // wird def ausgeben

                    Was macht diese "Nummerierung" ... und wie bekomme ich sie aus meiner
                    Ausgabe heraus?

                    Wenn du innerhalb deiner foreach-Schleife gar nicht am Index interessiert bist - dann kannst du die einfache Syntax nutzen, in der dir der Index gar nicht zur Verfügung gestellt wird.

                    In deinem Beispielcode hast du die erweiterte Syntax gewählt, die auch den Schlüsselwert (Index) liefert - und ausserdem gibst du den Wert dieses Schlüssels auch noch in dem HTML-Code, den du dynamisch erzeugst, mit aus.

                    MfG ChrisB

                    --
                    Light travels faster than sound - that's why most people appear bright until you hear them speak.
                    1. Tachchen!

                      Ich sage danke schön an euch und werde im Laufe des Abends mal schauen,
                      was man da noch so optimieren kann. Am Ende müssen ja auch noch die
                      Elternverzeichnisse aus der Liste raus und sowas.

                      Und wenn ich groß bin, werde ich auch Arays & Co verstehen ... und ihr
                      habt den Grundstein gelegt. ;-)

                      Gruß

                      Die schwarze Piste

                      1. hi,

                        Am Ende müssen ja auch noch die
                        Elternverzeichnisse aus der Liste raus und sowas.

                        Das kannst du -- wer hätte das gedacht -- auch mit einem Array lösen ;)

                         $_notallowed = array('.', '..', 'index.php', 'php.ini', 'config_dir');  
                          
                         foreach($_Dir as $_dval)  // Array durchlaufen  
                         {  
                           /*  
                            * um Verzeichnisse aufzulisten 'is_file()' durch 'is_dir()' ersetzen  
                           */  
                           if (is_file("$_rootdir/$_dval")  
                           AND !in_array($_dval, $_notallowed)) // hier wird gegen das oben geschriebene Array geprüft  
                           {  
                             $_dirlist .= sprintf('<li><a href="/%s/%2$s">%2$s</a></li>' . "\n"  
                                                 , $_rootdir  // ersetzt %s zwischen den '/'  
                                                 , $_dval     // ersetzt die zwei '%2$s'  
                                                 );  
                           }  
                         }
                        

                        Du musst da eh noch ein Paar Prüfungen einbauen, Bspw. ob 'dir' auch ein Verzeichnis ist und ob es sich scannen lässt, bevor du in die schleife gehst.

                        mfg

                        --
                        --
                      2. hi,

                        Apropos:

                        Und wenn ich groß bin, werde ich auch Arays & Co verstehen ... und ihr
                        habt den Grundstein gelegt. ;-)

                        http://forum.de.selfhtml.org/archiv/2008/4/t170302/#m1113099 -- gar nicht mal so lange her, mein erstes mal ;)

                        Ich könnt den Christoph knutschen, so oft wie der mich schon auf die richtige Bahn ge[schubst|boxt] hat ;))

                        mfg

                        --
                        --
                  2. hi,

                    Also mal weiter im Text. Ein bisserl dümmer kann ich sicher noch aussehen. ;-)

                    Immerhin hast du es zum laufen gekriegt, ist doch schon mal was ;)

                      
                    $dir    = './galerien';  
                    $files = scandir($dir, 1);  
                      
                    /*  
                       Hier wird $_Liste initialisiert, damit später mit dem '.=' dieser Variable Werte angehangen werden  
                       können -- wenn du in der schleife das Punkt vor dem '=' wegmachst, siehst du, was ich meine  
                    */  
                    $_Liste = '';  
                      
                    /*  
                       Hier sagen wir der Schleife, wie wir das Array gerne hätten  
                       Das ist ein einfaches Array mit jeweils Key und Value, also  
                       array($_Schluessel => $_Wert);  
                       In der Schleife können wir dann bei jedem durchlauf auf jeweils Key und Value zugreifen,  
                       und wenn du eins nicht möchtest, dann lässt du es einfach weg ;)  
                      
                       Foreach sagt Quasi: durchlaufe(Array als Schlüssel und Key)  
                       und so stehen die Werte dann in der Schleife zur verfügung  
                    */  
                    foreach($files as $_Schluessel => $_Wert) // das muss so bleiben, damit die Schleife arbeiten kann  
                       {  
                         // Die Schlüssel brauchen wir hier nicht, die legt PHP Intern an, damit die Werte  
                         // eindeutig identifizierbar sind  
                      
                         $_Liste .= sprintf('<li><a href="/%s/%2$s">%2$s</a></li>' . "\n"  
                                            , $dir     // ersetzt %s zwischen den '/'  
                                            , $_Wert   // ersetzt die zwei '%2$s'  
                                            );  
                       }  
                      
                       echo $_Liste;  
                     
                    
                    1. $_Liste = ''; gibt es ausschließlich, damit man hinterher $_Liste
                      nutzen kann? Bewirkt '' irgendwas?

                    Nein, das bewirkt nichts, die Variable wird lediglich initialisiert -- aber man kann im Script beim echo-Aufuf prüfen, ob Liste Leer ist, wenn ja, dann gibt es eine Fehlermeldung.

                    1. Ich verstehe auch nach x-fachem Lesen des Abschnitts in selfphp nicht,
                      was $_Schluessel = (oder =>) $_Wert mir sagen sollen/wollen?

                    Das ist einfach nur eine zuweisung des Wertes zu einem Schlüssel:
                      array($_Schluessel => $_Wert)
                    ist Quasi das gleiche wie
                      array('Name' => 'Malcolm')
                    Lass dich nit vom '=>' beirren, dass gehört einfach zum Array.

                    Du kannst auch ein array so schreiben:  array('Mann','Frau','Kind','Tier');

                    1. Im Ergebnis habe ich aber vor allem in dem Array jeweils eine
                      "Nummerierung" (das ist bestimmt mehr als das, aber was?),

                    Durch die Nummerierung wird jeder Wert im Array identifizierbar, so kannst du auch ohne schleife auf die Werte (sofern dir die Schlüssel bekannt sind) zugreifen, nehmen wir mal als Beispiel:

                      $_myfirstarray = array(  
                                             0  => 'schwarze'  
                                            ,1  => 'Piste'  
                                            ,2  => 'Fotograf'  
                                            );  
                      
                     echo $_myfirstarray[1]; // gibt 'Piste' aus
                    

                    wenn ich den Array durch scandir erhalte und ihn nicht händisch vorher herstelle.
                    Was macht diese "Nummerierung" ...

                    Die Nummerierung durch scandir() nimmt PHP vor, die ist Ok und gewollt, du musst den Schlüssel nur aus der Schleife raushalten, s. O.

                    mfg

                    --
                    --
  2. Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!

    PHP stellt Reihnungsfunktionen für Arrays zur Verfügung - die bekannteste dürfte sort() sein.

    1. Hello,

      PHP stellt Reihnungsfunktionen für Arrays zur Verfügung - die bekannteste dürfte sort() sein.

      also DAS Wort musst ich erstmal bei Google eingeben.
      Aber da kommt auch nur

      Meinten Sie: Reinigungsfunktion  Die ersten 2 angezeigten Ergebnisse

      Aus welcher Sprache stammt der Begriff?   ;-)

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Aus welcher Sprache stammt der Begriff?   ;-)

        Obersüdostbayerisch :p

        Das zusätzliche N ist geschenkt.

  3. Hello,

    *grummel*

    Aktuell möchte ich eine Liste von Links erstellen, die sich automatisch
    erstellt aus den jeweils vorhandenen Ordnern in einem "Sammelordner".
    Das stelle ich bislang wie folgt an.

    Das bedarf einiger Hinweise:

    <ul id="galerienliste">
    <?php
    $ordner = "./galerien";
    $erstellen = opendir($ordner);

    erst prüfen, ob opendir() erfolgreich war!

    if($erstellen)   ## ist ein belämmerter Bezeichner für ein Verzeichnishandle!
    {

    die nächste Zeiel ist unsicher, da Dateien oder Verzeichnisse mit dem Namen '0' zum

    Abbruch der Schleife führen würden

    #> while ($file = readdir ($erstellen))

    $_dir = array();
      while (false !==($file = readdir ($erstellen)))
      {

    if($file != "." && $file != "..")   ## die beiden if()s lassen sich zusammenfassen

    {

    if(is_dir($ordner."/".$file))

    {
    ##>             $compl = $ordner."/".$file;
    ##>             echo "<li><a href="".$compl."">".$file."</a></li>\n";
                  $_dir[] = $ordner."/".$file

    }
        }
    }
    closedir($erstellen);

    }

    echo "<pre>\r\n";
       echo htmlspecialchars(print_r($_dir,1));
       echo "</pre>\r\n";

    ?>
    </ul>

    Dort benenne ich die Ordner nun nach dem Schema Jahr_Monat_Tag.
    Das ist weder schön noch besonders elegant, aber es tut am Ende jedenfalls,
    was ich gerne hätte.
    Nur landet in dieser Liste natürlich der älteste Eintrag oben und der
    neuste unten. Ich hätte es aber gerne genau umgekehrt.

    Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!

    Trenne Datenhandling (Holen, Verarbeiten, Wegschreiben) von der Visualisierung der Daten

    Die Reihenfolge bei readdir() ist keine von der Applikation festgelegte, sondern eine vom OS ausgewürfelte. Die Dateinamen werden so geliefert, wie sie im Filesystem angereiht wurden. Da könnte durchaus auch schon mal eine Lücke gefüllt werden. Kommt eben auf das Filesystem an.

    Eine Ordnung erhältst Du nur durch ein Sortierkriterium, dass Du ja in den Namen implementiert hast. Du kannst die Dateien also nach dem Namen sortieren, um Dein Ziel zu erreichen.

    Dazu musst Du doch die Namen nur in einem Array sammeln und nicht sofort nach der Beschaffung ausgeben.

    Das geht allerdings nur bis zu einer gewissen Anzahl ;-)
    Ich hatte neulich das Problemchen mit ca 100.000 Dateien, deren Daten nach Görße und Namen sortiert ausgegeben werden sollten. Da gerät man dann schon leicht an die Speichergrenze von PHP auf typischen Installationen.

    und schau Dir auch mal die Funktion glob() an.
    http://de2.php.net/manual/en/function.glob.php

    die macht das, was Du willst, schon fast automatisch.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de