Markus Schnitzler: jüngste Datei(en) aus Verzeichnis mit PHP ermitteln

Da meine Google-Recherche keine zufriedenstellenden Ergebnisse gebracht hat, versuche ich es mal hier.
Ich bin gerade dabei, eine meiner Websites komplett zu renovieren. Auf der Seite sollen regelmäßig neue Artikel erscheinen. Jeder Artikel ist als separate PHP-Datei gespeichert und wird per include eingebunden. Nun möchte ich auf der Startseite die jeweils drei neusten Artikel anzeigen lassen. Links der allerneuste, daneben der zweitjüngste und rechts der drittjüngste. Damit ich nicht bei jedem Neuzugang die Artikel verschieben muss, frage ich mich nun, ob es eine Möglichkeit gibt, mit PHP automatisch den jüngsten Artikel aus dem Verzeichnis auswählen zu lassen.

Beispiel: Im Ordner "Artikel" liegen folgende Dateien, die nach dem Datum (in umgekehrter Reihenfolge Jahr-Monat-Tag) benannt sind.
20101209.php
20110107.php
20110223.php
20110311.php
20110405.php
Wenn ich die Seite manuell bearbeite, würde der jüngste Artikel also mit
<?php include "20110405.php" ?> eingebunden.

Nun soll PHP aber selbst ermitteln, was da in den include-Befehl gehört. Ich weiß, dass es Funktionen zum Verzeichnis-Auslesen (readdir) und zum Sortieren gibt. Aber gibt es auch einen Code, der mir sagt: "Die jüngste Datei im Ordner blabla ist Dateinamesoundso.php"?
Ich bitte um möglichst konkrete Antworten.

  1. Hi,

    Nun soll PHP aber selbst ermitteln, was da in den include-Befehl gehört. Ich weiß, dass es Funktionen zum Verzeichnis-Auslesen (readdir) und zum Sortieren gibt.

    Und was hast du mit diesen bisher versucht, um dein gewünschtes Ergebnis zu bekommen?

    Aber gibt es auch einen Code, der mir sagt: "Die jüngste Datei im Ordner blabla ist Dateinamesoundso.php"?

    Als eingebaute Funktion? Nein.

    Als fertiges Script-Schnippsel im Internet? Bestimmt.

    Ich bitte um möglichst konkrete Antworten.

    Und wir um möglichst konkrete Fragestellungen und Problembeschreibungen.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Liebe(r) ChrisB,

      Ich bitte um möglichst konkrete Antworten.

      Und wir um möglichst konkrete Fragestellungen und Problembeschreibungen.

      was fandest Du an dieser Formulierung nicht ausreichend?

      gibt es auch einen Code, der mir sagt: "Die jüngste Datei im Ordner blabla ist Dateinamesoundso.php"?

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hi!

        Ich bitte um möglichst konkrete Antworten.
        Und wir um möglichst konkrete Fragestellungen und Problembeschreibungen.
        was fandest Du an dieser Formulierung nicht ausreichend?
        gibt es auch einen Code, der mir sagt: "Die jüngste Datei im Ordner blabla ist Dateinamesoundso.php"?

        Nun, er hat ja schon eine Funktion gefunden, um sein Ziel zu erreichen, aber dann ist er anscheinend stehengeblieben und hat nicht versucht, weiterzulaufen. Wenn er das getan hätte und dabei auf ein konkretes Problem gestoßen wäre, dann wäre es angebracht, nach diesem konkret zu fragen. Allerdings hätte er dazu wissen müssen, dass die Suche nach einer Spezialfunktion nicht erfolgreich verlaufen kann und er den readdir()-Ansatz weiterverfolgen müsste.

        Aber: readdir() ist eine Möglichkeit, aber es gibt bessere: glob(). Das sortiert gleich mit, allerdings aufsteigend. Doch das entstehende Array kann man umdrehen (eine entsprechende Funktion befindet sich unter den Array-Funktionen) und sich dann die ersten drei Elemente rauspicken. Mit readdir() müsste man genauso vorgehen, nur dass man statt eines glob()-Aufrufs eine Abfrageschleife erstellen sich obendrein selbst noch die gewünschten Dateien selbst rausfiltern muss.

        Lo!

        1. Aber: readdir() ist eine Möglichkeit, aber es gibt bessere: glob(). Das sortiert gleich mit, allerdings aufsteigend.

          Die glob-Funktion ist aber ebenso wie readdir nur ein Teil der Lösung und bietet mir nicht das, was ich suche. Schließlich werden damit alle Dateien des Verzeichnisses bzw. alle mit einer bestimmten Dateiendung aufgelistet. Ich möchte aber erreichen, dass jeweils nur die jüngste (oder zweit-/drittjüngste) Datei ausgegeben wird. In dem eingangs genannten Beispiel soll also nur 20110405.php als Ergebnis der Funktion erscheinen.

          1. Hello,

            Aber: readdir() ist eine Möglichkeit, aber es gibt bessere: glob(). Das sortiert gleich mit, allerdings aufsteigend.
            Die glob-Funktion ist aber ebenso wie readdir nur ein Teil der Lösung und bietet mir nicht das, was ich suche. Schließlich werden damit alle Dateien des Verzeichnisses bzw. alle mit einer bestimmten Dateiendung aufgelistet. Ich möchte aber erreichen, dass jeweils nur die jüngste (oder zweit-/drittjüngste) Datei ausgegeben wird. In dem eingangs genannten Beispiel soll also nur 20110405.php als Ergebnis der Funktion erscheinen.

            Ja und?
            Dedlfix hat es Dir doch genau beschrieben:

            Mit Glob() die Dateien einsammeln, deren Namen zum Muster passen.
            Das Array mit array_reverse() umdrehen.
            Mittels Schleife oder sonstiger Technik die gewünschten x Elemente des Arrays, sofern vorhanden (!), einbinden ins HTML-Gerüst.

            Wo ist da jetzt noch eine Frage offen?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hi,

              Mit Glob() die Dateien einsammeln, deren Namen zum Muster passen.
              Das Array mit array_reverse() umdrehen.

              halte ich nicht für sinnvoll. Viel Rechenaufwand, kein Mehrwert.
              Warum nicht einfach einmal (zweimal, dreimal) poppen?

              Wo ist da jetzt noch eine Frage offen?

              Das hat mich ja auch schon gewundert ...

              So long,
               Martin

              --
              There are 10 types of people in the world: Those who understand the binary system, and those who don't.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hello,

                Mit Glob() die Dateien einsammeln, deren Namen zum Muster passen.
                Das Array mit array_reverse() umdrehen.

                halte ich nicht für sinnvoll. Viel Rechenaufwand, kein Mehrwert.
                Warum nicht einfach einmal (zweimal, dreimal) poppen?

                Klar ist Poppen eine nette Möglichkeit. Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind. Sonst bringt das Poppen nichts :-P

                Da das Array, das Glob() erzeugt, ein numerisches ist, kann man auch einfach einen Direktzugriff auf die drei letzten Elemente (oder wieviele man eben braucht) wagen:

                $last = count($_globresult)-1;

                echo (isset($_globresult[$last]?:''));
                   echo (isset($_globresult[$last-1]?:''));
                   echo (isset($_globresult[$last-2]?:''));

                Das ist jetzt nur ein weiterer Lösungsweg. Der muss selbstverständlich noch angepasst und vervollständigt werden...

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hello Tom,

                  Klar ist Poppen eine nette Möglichkeit.

                  Hehe ..., eindeutig zweideutig!

                  Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind. Sonst bringt das Poppen nichts :-P

                  Ist das nicht ein bischen "doppeltgemoppelt"?
                  Du musst doch lediglich prüfen, ob $count >= der gewünschten Anzahl ist. Und wenn man bspw. eine for-Schleife für das Poppen verwendet entweder die gewünschte Anzahl, oder falls $count kleiner ist, $count verwenden.

                  Gruß Gunther

                  1. Hello,

                    Ist das nicht ein bischen "doppeltgemoppelt"?
                    Du musst doch lediglich prüfen, ob $count >= der gewünschten Anzahl ist. Und wenn man bspw. eine for-Schleife für das Poppen verwendet entweder die gewünschte Anzahl, oder falls $count kleiner ist, $count verwenden.

                    Ich würde nur prüfen, ob es sich um ein Array handelt (um die Warnung zu vermeiden) und dann solange poppen, wie das Ergebnis ungleich (!==) NULL ist.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Ich würde nur prüfen, ob es sich um ein Array handelt (um die Warnung zu vermeiden) und dann solange poppen, wie das Ergebnis ungleich (!==) NULL ist.

                      Dann hast Du alle Dateien nicht nur ein, zwei oder drei Stück. Und wenn Du eine fors-Schleife nimmst um nur die richtige Anzahl zu bekommen, wozu bei jedem Durchlauf prüfen, wenn einmal reicht?

                      1. Hello,

                        Ich würde nur prüfen, ob es sich um ein Array handelt (um die Warnung zu vermeiden) und dann solange poppen, wie das Ergebnis ungleich (!==) NULL ist.

                        Dann hast Du alle Dateien nicht nur ein, zwei oder drei Stück. Und wenn Du eine fors-Schleife nimmst um nur die richtige Anzahl zu bekommen, wozu bei jedem Durchlauf prüfen, wenn einmal reicht?

                        Wie meinst Du das? Wieso muss ich nur einmal prüfen?

                        Ich habe allerdings unterlassen zu schreiben, dass man mitzählen muss.

                        Also nochmal:
                           Ich würde prüfen, ob es sich um ein Array handelt (um eine Warnung von array_pop() zu vermeiden)
                           und dann solange poppen, wie das Ergebnis ungleich (!==) NULL und die gewünschte Anzahl
                           noch nicht erreicht ist.

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                        1. Hello,

                          Ich würde nur prüfen, ob es sich um ein Array handelt (um die Warnung zu vermeiden) und dann solange poppen, wie das Ergebnis ungleich (!==) NULL ist.

                          Dann hast Du alle Dateien nicht nur ein, zwei oder drei Stück. Und wenn Du eine fors-Schleife nimmst um nur die richtige Anzahl zu bekommen, wozu bei jedem Durchlauf prüfen, wenn einmal reicht?

                          Wie meinst Du das? Wieso muss ich nur einmal prüfen?

                          Im Prinzip so:

                          $gewuenschte_anzahl = 3;  
                            
                          if (count($sortierte_dateinamen) < $gewuenschte_anzahl) {  
                            $interval = count($sortierte_dateinamen);  
                          } else {  
                            $interval = $gewuenschte_anzahl;  
                          }  
                          for ($z = (count($sortierte_dateinamen) - 1); $z >= (count($sortierte_dateinamen) - $interval); $z--) {  
                            ... $sortierte_dateinamen[$z] //was auch immer  
                          }  
                          
                          

                          Eine for-Schleife und ein if. Na gut, die for-Schleife enthält auch eine Prüfung pro Durchlauf.

                          und dann solange poppen, wie das Ergebnis ungleich (!==) NULL und die gewünschte Anzahl
                             noch nicht erreicht ist.

                          Also eine Schleife und bei jedem Schleifendurchgang eine if-Abfagen mit zwei Bedingungen oder eine while-Schleife mit einer if-Abfrage je Schleifendurchgang.

                          1. Hello,

                            und dann solange poppen, wie das Ergebnis ungleich (!==) NULL und die gewünschte Anzahl
                               noch nicht erreicht ist.

                            Also eine Schleife und bei jedem Schleifendurchgang eine if-Abfagen mit zwei Bedingungen oder eine while-Schleife mit einer if-Abfrage je Schleifendurchgang.

                            Die While-Schleife hat doch eine Schleifenbedingung. Da muss man kein zussätzlich IF einbauen :-)

                            Pseudocode:

                            while ((bericht=poppen(berichtearray))!== NULL)
                               {
                                   drucke bericht;
                               }

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            --
                             ☻_
                            /▌
                            / \ Nur selber lernen macht schlau
                            http://bergpost.annerschbarrich.de
                            1. Die While-Schleife hat doch eine Schleifenbedingung. Da muss man kein zussätzlich IF einbauen :-)

                              Dennoch wird (über das Zählen der Beiträge hinaus) bei jedem Schleifendurchlauf eine (zusätzliche) Bedingung geprüft.

                  2. Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind. Sonst bringt das Poppen nichts :-P

                    Ist das nicht ein bischen "doppeltgemoppelt"?
                    Du musst doch lediglich prüfen, ob $count >= der gewünschten Anzahl ist. Und wenn man bspw. eine for-Schleife für das Poppen verwendet entweder die gewünschte Anzahl, oder falls $count kleiner ist, $count verwenden.

                    Wenn man schon eine for-Schleife verwendet, warum die dann nicht gleich rückwärts laufen lassen, aufs Poppen verzichten und direkt zugreifen?

                    1. Hello,

                      Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind. Sonst bringt das Poppen nichts :-P

                      Ist das nicht ein bischen "doppeltgemoppelt"?
                      Du musst doch lediglich prüfen, ob $count >= der gewünschten Anzahl ist. Und wenn man bspw. eine for-Schleife für das Poppen verwendet entweder die gewünschte Anzahl, oder falls $count kleiner ist, $count verwenden.

                      Wenn man schon eine for-Schleife verwendet, warum die dann nicht gleich rückwärts laufen lassen, aufs Poppen verzichten und direkt zugreifen?

                      Kommt darauf an, in welcher Reihenfolge man die Berichte haben will. Wenn Du den neusten zuerst stehen haben willst, wäre das in der Tat eine praktikable Lösung. Man muss nur ebenfalls prüfen, ob der Index >= 0 ist, bzw. eben genügend Elemente vorhanden sind.

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Kommt darauf an, in welcher Reihenfolge man die Berichte haben will.

                        Und der Unterschied zum Poppen ist? Richtig, man kann die Schleife auch vorwärts bis zum Ende laufen lassen, beim Poppen sieht es da schlecht aus.

                2. Hi!

                  Klar ist Poppen eine nette Möglichkeit. Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind.

                  Nein, muss man nicht, denn array_pop() liefert null, wenn alles weg ist. Das muss man nur auswerten.

                  Lo!

                  1. Hello,

                    Klar ist Poppen eine nette Möglichkeit. Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind.

                    Nein, muss man nicht, denn array_pop() liefert null, wenn alles weg ist. Das muss man nur auswerten.

                    Also fragt man hinterher, ob das Element noch da war. Sag ich doch, man muss fragen :-)
                    Warum soll ich noch weiter HTML-Code generieren, wenn der keijen Content mehr erhalten kann?

                    Die POP()-Methode kann dann mit einer kopfgesteuerten Schleife arbieten, um die HTML-Elemente zu erzeugen. Sollte Markus also überhaupt noch mitlesen, hätte er nun schon wieder einen Detailvorschlag für eien mögliche Lösung...

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Hi!

                      Klar ist Poppen eine nette Möglichkeit. Man muss aber trotzdem immer fragen, ob noch Elemente vorhanden sind.
                      Nein, muss man nicht, denn array_pop() liefert null, wenn alles weg ist. Das muss man nur auswerten.
                      Also fragt man hinterher, ob das Element noch da war. Sag ich doch, man muss fragen :-)

                      Entscheidend ist, wie man fragt. Man muss nicht extra fragen, ob noch was da ist, wenn einem diese Information von der ansonsten sowieso notwendigen pop-Funktion mitgeliefert wird. Hier nicht, aber in anderen Fällen umgeht man so Tocttou-Probleme.

                      Lo!

                3. »»Ja und? Dann gib aus dem Array, das glob() liefert, eben nur den letzten (zweit/drittletzten) Eintrag zurück. Das kann doch wohl nicht mehr das Problem sein!

                  Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?

                  Mit dem Code

                  <?php  
                  foreach (glob("Artikel/*.php") as $filename) {  
                  echo $filename . '<br>'; }  
                  ?>
                  

                  erhalte ich eine schöne Liste:

                  Artikel/20101209.php
                  Artikel/20110107.php
                  Artikel/20110223.php
                  Artikel/20110311.php
                  Artikel/20110405.php

                  Aber ich möchte als Ergebnis nur Artikel/20110405.php haben.

                  Da das Array, das Glob() erzeugt, ein numerisches ist, kann man auch einfach einen Direktzugriff auf die drei letzten Elemente (oder wieviele man eben braucht) wagen:

                  $last = count($_globresult)-1;

                  echo (isset($_globresult[$last]?:''));
                     echo (isset($_globresult[$last-1]?:''));
                     echo (isset($_globresult[$last-2]?:''));

                  Das ist jetzt nur ein weiterer Lösungsweg. Der muss selbstverständlich noch angepasst und vervollständigt werden...

                  Das klingt interessant. Aber wie kann ich das in den oben genannten glob-Code einfügen?

                  <?php  
                  foreach (glob("Artikel/*.php") as $filename) {  
                  $last = count($_globresult)-1;  
                  echo (isset($_globresult[$last]?:'')); }  
                  ?>
                  

                  oder

                  <?php  
                  foreach (glob("Artikel/*.php") as $filename) {  
                  $last = count($_globresult)-1;  
                  echo (isset($_globresult[$last]?:'')); }  
                  ?>
                  

                  produzieren nur Fehlermeldung in der Art
                  Parse error: syntax error, unexpected '?', expecting ',' or ')'

                  1. Ups, jetzt hab ich zweimal das gleiche genannt. Hinter dem "oder" meinte ich als zweite Alternative

                    <?php  
                    foreach (glob("Artikel/*.php") as $filename) {  
                    echo $filename . '<br>'; }  
                    $last = count($_globresult)-1;  
                    echo (isset($_globresult[$last]?:''));  
                    ?>
                    
                  2. Hi!

                    Ja und? Dann gib aus dem Array, das glob() liefert, eben nur den letzten (zweit/drittletzten) Eintrag zurück. Das kann doch wohl nicht mehr das Problem sein!

                    Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?

                    Vielleicht solltest du auch versuchen zu verstehen, was dir die User hier vorschlagen?
                    Deine Frage lässt mich vermuten, dass dir Arrays und die Array Funktionen von PHP nicht unbedingt vertraut sind. Auch das solltest du ändern.

                    Die vorgeschlagene glob() Funktion liefert dir, sofern vorhanden, die entsprechenden Dateinamen_bereits_sortiert_in einem numerischen Array zurück. Mit der einzigen "Einschränkung", dass die Sortierung aufsteigend ist, d.h. das neueste Datum findet sich am Ende des Arrays.

                    Und Martin hat dir auch schon geschrieben, wie du an das letzte Element eines Arrays herankommst.

                    Du durchläufst mittels einer foreach Schleife das komplette Array. Wozu?
                    Das ist doch nicht das, was du willst.

                    Du weisst doch schon, dass das was du suchst im letzten Array Element zu finden ist. Also verwende es doch einfach an der passenden Stelle.

                    Ebenfalls wurde hier jetzt schon mehrfach erwähnt, wie du an die Anzahl der Array-Elemente kommst und somit weisst, welchen (numerischen) Index das von dir gesuchte Array-Element hat.

                    Es gibt hier, wie so oft, viele Wege, die nach Rom führen. Entscheide dich für einen der hier im Thread vorgeschlagenen Varianten.

                    Wenn dir jetzt immer noch nicht klar ist, wie du die einzelnen Fragmente zusammenfügen musst, dann empfehle ich das Studium des PHP Manuals zu jeder hier genannten Funktion.

                    Gruß Gunther

                  3. Hi,

                    Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?

                    Das wurde doch schon gesagt - du kannst sie bspw. in ein Array packen, dieses dann sortieren, und anschließend auf das erste Element zugreifen.

                    Könntest du jetzt, statt andauernd nur zu meckern, vielleicht mal etwas *Eigeninitiative* zeigen?

                    [...] produzieren nur Fehlermeldung in der Art
                    Parse error: syntax error, unexpected '?', expecting ',' or ')'

                    Beschäftige dich bitte mit den *Grundlagen* von PHP, wenn du es einsetzen willst.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. Hi!

                      Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?

                      Das wurde doch schon gesagt - du kannst sie bspw. in ein Array packen, dieses dann sortieren, und anschließend auf das erste Element zugreifen.

                      Warum wollt ihr alle sortieren? Man kann auf PHP-Arrays an "beiden Enden angreifen" - der Vorschlag kam doch bereits von Martin.

                      Beschäftige dich bitte mit den *Grundlagen* von PHP, wenn du es einsetzen willst.

                      [x] dafür

                      off:PP

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

                        Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?
                        Das wurde doch schon gesagt - du kannst sie bspw. in ein Array packen, dieses dann sortieren, und anschließend auf das erste Element zugreifen.
                        Warum wollt ihr alle sortieren? Man kann auf PHP-Arrays an "beiden Enden angreifen" - der Vorschlag kam doch bereits von Martin.

                        Wenn man davon ausgeht, dass er glob() verwendet, muss nicht mehr sortiert werden. Das grundlegende Prinzip, mit dessen Verstehen er sich bisher etwas schwer tat, ist aber, dass er unbedingt immer alle Dateien einlesen und sortieren muss. Das kann einem ein glob() abnehmen. Oder man liest zu Fuß mit readdir() ein und sortiert ebenfalls selbst. Erst dann kann man an einem der beiden Enden (je nach Sortierrichtung) die gewünschte Information abfassen. Eine Sortierung ist also auf jeden Fall notwendig, ob implizit im glob() oder explizit.

                        Lo!

                        1. Hello,

                          Eine Sortierung ist also auf jeden Fall notwendig, ob implizit im glob() oder explizit.

                          Naja, man könnte ja auch den größten Wert raussuchen lassen, ihn verarbeiten und dann anschließend das Element aus dem Array löschen. Das wiederholt man dann eben solange, wie man es braucht und Elemente vorhanden sind.

                          Warum einfach, wenn es auch umständlich geht.

                          BTW:
                          bei einer generischen Verarbeitung würde ich das so machen, weil es dann die billigste Variante wäre, wenn man nur eine kleine Untermenge aus der gesamten Dateienmenge benötigt.

                          Da PHP aber bereits mächtige Funktionen wie glob() zur Verfügung stellt, ist deren Verwendung eben bequemer.

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                        2. Hi!

                          Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?
                          Das wurde doch schon gesagt - du kannst sie bspw. in ein Array packen, dieses dann sortieren, und anschließend auf das erste Element zugreifen.
                          Warum wollt ihr alle sortieren? Man kann auf PHP-Arrays an "beiden Enden angreifen" - der Vorschlag kam doch bereits von Martin.

                          Wenn man davon ausgeht, dass er glob() verwendet, muss nicht mehr sortiert werden.

                          Ok.

                          Das grundlegende Prinzip, mit dessen Verstehen er sich bisher etwas schwer tat, ist aber, dass er unbedingt immer alle Dateien einlesen und sortieren muss. Das kann einem ein glob() abnehmen.

                          Klar.

                          Oder man liest zu Fuß mit readdir() ein und sortiert ebenfalls selbst.

                          Bei der PHP-Entwicklung überlasse ich gerne möglichst viel den "fest eingebauten" Funktionen/Methoden.

                          Erst dann kann man an einem der beiden Enden (je nach Sortierrichtung) die gewünschte Information abfassen. Eine Sortierung ist also auf jeden Fall notwendig, ob implizit im glob() oder explizit.

                          Naja, ich setzte bei glob() an und dann bieten sich die "geerbten" array_pop, und array_shift doch recht deutlich an, um an beiden Enden zu fischen.

                          Zu Übungs-, Lern- und Testzwecken ist es sicherlich sinnvoll, so etwas einmal selbst zu coden, von mir aus auch in PHP. Aber: gerade PHP wird ja häufig eingesetzt, um eben nicht das Rad neu erfinden zu müssen. PHP selbst muß man deshalb aber eben doch recht gut kennen und auch wenn viel über PHP gelästert wird, ist es nicht ganz trivial sich damit zu befassen.

                          Ich mag PHP sehr gerne: als beste Template-Engine überhaupt und für Rapid Prototyping kenne ich (auch im Enterprise-) Webumfeld nichts besseres. Und wenn mir jetzt einer mit Perl[*] kommt...

                          off:PP

                          [*] das ich sehr gerne dazu einsetze um unter Solaris oder anderen Unices Routine-Aufgaben zu vereinfachen.

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

                    »»Ja und? Dann gib aus dem Array, das glob() liefert, eben nur den letzten (zweit/drittletzten) Eintrag zurück. Das kann doch wohl nicht mehr das Problem sein!

                    Doch! Genau ist das ist das Problem, von dem ich die ganze Zeit rede. Wie bekomme ich aus dieser Liste die neuste Datei?

                    indem Du den Rückgabewert der Funktion glob() in einer Variable speicherst. Anstatt dessen durchläufst Du das Ergebnis nur und wirfst es einfach weg:

                    <?php

                    foreach (glob("Artikel/*.php") as $filename) {
                    echo $filename . '<br>'; }
                    ?>

                      
                      
                    ~~~php
                    $filelist = [link:http://de3.php.net/manual/de/function.glob.php@title=glob]("Artikel/*.php");    // $filelist enthält nun ein  
                                                          // wunderbares Array.  
                                                          // oder FALSE :-)  
                    // Wende darauf - [pref:t=204328;m=1383667@title=wie von Tom angeführt] - Arrayfunktionen und -zugriff an.  
                    // Gemeinerweise habe ich einen anderen Variablennamen verwendet als Tom.  
                    // Ich halte meinen für sinnvoller ...  
                    
                    

                    Ach ja. Chris meint hier völlig zu Recht: das sind ganz normale PHP-Grundlagen - das ist nichts besonderes. Gunthers Beitrag fand nicht nur ich sehr hilfreich.

                    Freundliche Grüße

                    Vinzenz

              2. Hi,

                jetzt muss ich doch auch noch meinen Senf dazu geben ...
                Ich finde so eine selbst auferlegte Begrenzung von maximal einem Artikel pro Tag ja prinzipiell sehr gut - da kommt man wenigstens nicht in Versuchung doch mal 2 oder 3 Artikel am selben Tag rauszuhauen, aber ...

                Wenn ich schon so eine Grundstruktur wählen würde (was ich nicht machen würde), dann würde ich sie zumindest gleich in der Form 'YYYYMMDD_n.php' erweitern, wobei 'n' eine fortlaufende Nummer (egal ob bei 0 oder 1 beginnend) ist.

                Das eröffnet dann immerhin die theoretische Möglichkeit auch mal mehr als einen Artikel am Tag zu verfassen/veröffentlichen.

                Just my 2 cents ...

                Gruß Gunther

                1. Hello,

                  jetzt muss ich doch auch noch meinen Senf dazu geben ...
                  Ich finde so eine selbst auferlegte Begrenzung von maximal einem Artikel pro Tag ja prinzipiell sehr gut - da kommt man wenigstens nicht in Versuchung doch mal 2 oder 3 Artikel am selben Tag rauszuhauen, aber ...

                  Wenn ich schon so eine Grundstruktur wählen würde (was ich nicht machen würde), dann würde ich sie zumindest gleich in der Form 'YYYYMMDD_n.php' erweitern, wobei 'n' eine fortlaufende Nummer (egal ob bei 0 oder 1 beginnend) ist.

                  Das liest sich schon gut. Wenn 1 Sekunde als Granularität reicht, dann könnest DU auch die Zeit mit HHmmss anhängen. Das wäre dann konsequent bezüglich des Erzeugungszeitpunktes.

                  Wesentlich ist wohl nur, dass das Ordnungskriterium (der Namensteil der Datei) eindeutig sortierbar bleibt.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                2. Hi!

                  Wenn ich schon so eine Grundstruktur wählen würde (was ich nicht machen würde), dann würde ich sie zumindest gleich in der Form 'YYYYMMDD_n.php' erweitern, wobei 'n' eine fortlaufende Nummer (egal ob bei 0 oder 1 beginnend) ist.

                  Das wird bei mehr als zehn Dateien/Tag aber schon spannend.

                  off:PP

                  --
                  "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
              3. Hi Martin!

                Mit Glob() die Dateien einsammeln, deren Namen zum Muster passen.
                Das Array mit array_reverse() umdrehen.

                halte ich nicht für sinnvoll. Viel Rechenaufwand, kein Mehrwert.
                Warum nicht einfach einmal (zweimal, dreimal) poppen?

                Das ist wohl der sinnvollste Vorschlag - dafür sind die elementaren Funktionen array_push, array_pop, array_unshift und array_shift da.

                off:PP

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

            Aber: readdir() ist eine Möglichkeit, aber es gibt bessere: glob(). Das sortiert gleich mit, allerdings aufsteigend.
            Die glob-Funktion ist aber ebenso wie readdir nur ein Teil der Lösung und bietet mir nicht das, was ich suche.

            nein, aber etwa 90% davon. Oder sogar mehr, je nach Betrachtungsweise.

            Schließlich werden damit alle Dateien des Verzeichnisses bzw. alle mit einer bestimmten Dateiendung aufgelistet.

            Richtig, und zwar sortiert in einem Array.

            Ich möchte aber erreichen, dass jeweils nur die jüngste (oder zweit-/drittjüngste) Datei ausgegeben wird. In dem eingangs genannten Beispiel soll also nur 20110405.php als Ergebnis der Funktion erscheinen.

            Ja und? Dann gib aus dem Array, das glob() liefert, eben nur den letzten (zweit/drittletzten) Eintrag zurück. Das kann doch wohl nicht mehr das Problem sein!

            Oder ist die Benamsung nicht konsequent, und du musst *wirklich* den Datei-Timestamp abfragen? Dann ist es etwas mehr Aufwand. Das habe ich aber aus deiner Beschreibung so nicht herausgelesen.

            Ciao,
             Martin

            --
            Besteht ein Personalrat aus nur einer Person, erübrigt sich die Trennung nach Geschlechtern.
              (aus einer Info des deutschen Lehrerverbands Hessen)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          3. Hi!

            Aber: readdir() ist eine Möglichkeit, aber es gibt bessere: glob(). Das sortiert gleich mit, allerdings aufsteigend.
            Die glob-Funktion ist aber ebenso wie readdir nur ein Teil der Lösung und bietet mir nicht das, was ich suche. Schließlich werden damit alle Dateien des Verzeichnisses bzw. alle mit einer bestimmten Dateiendung aufgelistet. Ich möchte aber erreichen, dass jeweils nur die jüngste (oder zweit-/drittjüngste) Datei ausgegeben wird.

            Ich verstehe deinen Hang zur Datensparsamkeit, jedoch: es geht so nicht. Es gibt keine Funktion zur Ermittlung _nur_ der neuesten Datei, weder anhand des Timestamps noch über den Dateinamen, der die Datumsangabe enthält. Du musst zwingend alle Datein einleden und darin diejenigen suchen, die du willst.

            Wenn du dir dabei deutlich mehr Arbeit machen willst als mit dem glob()-Dreizeiler, dafür aber das Anlegen des Arrays sparen willst, nimm readdir() und merk dir die ersten drei Dateien. Bei allen weiteren vergleichst du, ob die aktuelle Datei neuer als eine der drei gemerkten ist, wirfst dann die älteste von ihnen weg und legst an ihre Stelle die aktuelle.

            Lo!

  2. Lieber Markus Schnitzler,

    Du suchst offensichtlich die PHP-Funktion filemtime(), welche den Zeitpunkt der letzten Änderung einer Datei (ich merke sie mir als "file modified timestamp") ermittelt und als Timestamp zurück gibt.

    Alle Dateien eines Verzeichnisses auf die neuesten drei zu prüfen bekommst Du nun selbst hin, oder?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi!

      Du suchst offensichtlich die PHP-Funktion filemtime(), welche den Zeitpunkt der letzten Änderung einer Datei (ich merke sie mir als "file modified timestamp") ermittelt und als Timestamp zurück gibt.

      Nö, offensichtlich sucht er die nicht, denn die Zeit-Information hat er im Dateinamen stehen. Der bleibt auch dann gleich, wenn man mal Tage später zum Beispiel noch Tippfehler entfernt.

      Lo!

  3. Hi,

    Nun soll PHP aber selbst ermitteln, was da in den include-Befehl gehört.

    Du liest das Verzeichnis aus, speicherst die Namen in ein Array und verwendest rsort. Das erste Element sollte dann das jüngste sein.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.