Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Dateiliste gruppieren (https://www.delphipraxis.net/65144-%5Bphp%5D-dateiliste-gruppieren.html)

Luckie 12. Mär 2006 22:35


[PHP] Dateiliste gruppieren
 
Ich habe in einem Array mit Datei. Diese würde ich nun gerne Gruppieren nach Jahren oder Moantn. Hat da jemand eine Idee, wie man das dynamisch gestallten könnte ohne die Datumsabfrage hard zu codieren?

titus 12. Mär 2006 22:41

Re: [PHP] Dateiliste gruppieren
 
Hi Michael

Meine Gegenfragen:
  • Sollen die als Liste ausgegeben werden?
  • Wie sind die Daten abgespeichert (Timestamp/DD.MM.YYYY)?

mfG, titus

Luckie 12. Mär 2006 22:43

Re: [PHP] Dateiliste gruppieren
 
Es ist eine Dateiliste vom Dateisystem: http://www.michael-puff.de/Developer/Artikel/_index.php (Ich bin gerade am probieren.)

titus 12. Mär 2006 22:58

Re: [PHP] Dateiliste gruppieren
 
Also ich denke mir dass du deine Dateien nach dem Änderungs- bzw. Erstellungsdatum kategorisieren willst.

Jetzt kannst du ja einfach via date('m', $ausgelesenes_datum); einfach überprüfen ob ein neuer Monat erreicht ist.
Die Idee ist natürlich nur vereinfacht und leicht umzusetzen.

mfG

Luckie 12. Mär 2006 23:00

Re: [PHP] Dateiliste gruppieren
 
Genau so was...
Code:
$files = ListFiles($_SERVER['DOCUMENT_ROOT'].'/Developer/Artikel/', 'time');

    $year2006 = Array();
    $cnt2006 = 0;
   
    $yaer2005 = Array();
    $cnt2005 = 0;
    foreach($files as $file)
    {
      $title = GetTitleFromHTML($$file);

      switch (date("Y", filemtime($file)))
      {
        case '2006':
          $year2006[$cnt2006] = $file;
          $cnt2006++;
          break;
        case '2005':
          $year2005[$cnt2005] = $file;
          $cnt2005++;
          break;
      }
    }

    echo "2006
\n";
    foreach($year2006 as $file)
    {
      $title = GetTitleFromHTML($file);
      echo "$title
\n";
    }
    echo "

";
    echo "2005
\n";
    foreach($year2005 as $file)
    {
      $title = GetTitleFromHTML($file);
      echo "$title
\n";
    }
...wollte ich eigentlich vermeiden.

titus 12. Mär 2006 23:05

Re: [PHP] Dateiliste gruppieren
 
Das lässt sich sicher auch dynamisch regeln.
D.h. erstmal alle Jahre rausfinden die vorhanden sind (wir haben ja alle Dateinamen im Array) und dann halt durcharbeiten mit einer Schleife.

mfG

Luckie 12. Mär 2006 23:07

Re: [PHP] Dateiliste gruppieren
 
Und eben genau das wollte ich wissen, wie man das löst. ;)

titus 12. Mär 2006 23:17

Re: [PHP] Dateiliste gruppieren
 
Naja erstmal sowas wie get_years() z.B.:

//edit: ups der ließt ja jetzt ordner aus :roll:. ich denke du kannst das sicher ändern, dass er deine filelist nimmt ;) (wenn's überhaupt was taugt)
Code:
<?php
function get_years($dir_name) {
   $dir  = dir($dir_name);
   $years = array();

   while($file = $dir->read()) {
      $year = date('Y', filemtime($dir_name . $file));
      if (!in_array($year, $years)) {
         $years[] = $year; // datum + dateiname speichern lässt sich später sortieren dann (auch seperat speicherbar etc ;).
         $filename[] = $file;
      }
   }

   return $years;
}

print_r(get_years('./ordner/'));
?>
Ließe sich sicher auch leicht an Monate anpassen etc.

mfG

Luckie 12. Mär 2006 23:49

Re: [PHP] Dateiliste gruppieren
 
Ich habe es erstmal hardgecodet. Ändern muss ich es ja immer nur einmal im Jahr. ;)

http://www.michael-puff.de/Developer/Artikel/

Sieht ganz schick aus, wie ich finde. ;)

titus 12. Mär 2006 23:51

Re: [PHP] Dateiliste gruppieren
 
Zitat:

Zitat von Luckie
Ich habe es erstmal hardgecodet. Ändern muss ich es ja immer nur einmal im Jahr. ;)

http://www.michael-puff.de/Developer/Artikel/

Okay, aber wenn du es dann dynamisch machst, dann kannst du ja meinen Ansatz nehmen :).

Zitat:

Zitat von Luckie
Sieht ganz schick aus, wie ich finde. ;)

jep ;)

mfG

Luckie 12. Mär 2006 23:53

Re: [PHP] Dateiliste gruppieren
 
Jupp, wenn ich wieder Zeit und Lust habe. Versprochen.

MathiasSimmack 12. Mär 2006 23:54

Re: [PHP] Dateiliste gruppieren
 
Oder meinen :stupid:
Code:
   function sortFiles($dirName)
   {
      $fileArray = array();
      $dir = dir($dirName);
      while ($file = $dir->read())
      {
         if (is_file($file))
         {
            $fileDate = gmdate("Y-m-d",filemtime($file));
            $fileArray[] = array($fileDate, $file);
         }
      }

      arsort($fileArray);
      foreach ($fileArray as $file)
      {
         echo "$file[1], $file[0]\n";
      }
   }

   sortFiles(".");

Luckie 12. Mär 2006 23:56

Re: [PHP] Dateiliste gruppieren
 
Da habe ich dann aber nur eine sortierte List und keine gruppierte oder?

MathiasSimmack 12. Mär 2006 23:56

Re: [PHP] Dateiliste gruppieren
 
Na, irgendwas musst du ja auch noch selbst machen. :mrgreen:

Luckie 12. Mär 2006 23:58

Re: [PHP] Dateiliste gruppieren
 
Sortieren ist ja kein Problem, das kann ich ja schon. ;)

Pr0g 13. Mär 2006 00:47

Re: [PHP] Dateiliste gruppieren
 
Ich habe den Code aus diesem Post von dir mal als Vorlage genommen. Da ich nicht genau weiß, ob du die Funktion ListFiles() auch noch anders nutzen willst (etwa anders sortieren), habe ich deine Funktionen als Grundlage für den Code genommen:
Code:
<?php
  // Dateien nach Datum sortiert als Liste auslesen
  $dir = './';
  $files = ListFiles($dir, 'time');
 
  // Dateien nach Jahren gruppiert ausgeben
  $group_year = 0;
  foreach ($files as $file) {
    $file = $dir . $file;
    $file_year = date('Y', filemtime($file));
   
    if ($file_year <> $group_year) {
      if ($group_year > 0) {
        echo '

';
      }
      $group_year = $file_year;
      echo $group_year . '
';
    }

    echo GetTitleFromHTML($file) . '
';
  }
?>
Zum Testen des Scriptes hatte ich mir ein paar Dummyfunktionen geschrieben, wie du an meinem ListFiles siehst wird das Datum zum Sortieren mitgespeichert. Würde dies erhalten bleiben (was deine ja nicht macht soweit ich das sehen konnte), so kann man sich das spätere Auslesen sparen...
Code:
  // --- [Start: Dummy Funktionen zum Test] -----------------------------------
  function ListFiles($dir, $foo) {
    $dh = opendir($dir);
    $files_tmp = array();
    while (($file = readdir($dh)) !== false) {
      if (is_file($file)) {
        $files_tmp[] = array(filemtime($dir . $file), $file);
      }
    }
    arsort($files_tmp);
    $files = array();
    foreach ($files_tmp as $file){
      $files[] = $file[1];
    }
    return $files;
  }
   
  function GetTitleFromHTML($file) {
    return '[' . date('Y-m-d', filemtime($file)) . '] ' . basename($file);
  }
  // --- [Ende: Dummy Funktionen zum Test] ------------------------------------

Luckie 13. Mär 2006 07:06

Re: [PHP] Dateiliste gruppieren
 
Das ist gemial und funktioniert. :P So schön kurz. :thumb: Ich verstehe den Code nur noch nicht ganz. :gruebel:

Pr0g 13. Mär 2006 14:12

Re: [PHP] Dateiliste gruppieren
 
Das Grundprinzip ist recht simple. In der Liste stehen alle Dateien nach Datum sortiert, also die neuste Datei oben. Nun wird geschaut, was fürn Änderungsjahr die Datei hat und eine Gruppe dazu geöffnet (indem das Jahr ausgegeben wird). Nun wird die nächste Datei genommen. Hat sie das gleiche Jahr, dann einfach ausgeben, wenn nicht, dann vorher eine neue Gruppe öffnen (da nun ja keine Datei mehr der ersten Gruppe kommt). Ich habe den Code nochmal was kommentiert:
Code:
<?
  // Dateien nach Datum sortiert als Liste auslesen
  $dir = './';
  $files = ListFiles($dir, 'time');
 
  // Aktuelle Gruppe bekommt das Jahr 0 (bedeutet, dass es noch keine Gruppe
  // vorher gibt - es wäre auch ein anderer Angangswert möglich, hauptsache ist
  // das der Wert nicht das Änderungsjahr einer Datei ist und somit eindeutig
  // als Anfangswert erkennbar bleibt [siehe spätere if Abfrage])
  $group_year = 0;
  // Alle Dateinamen der Liste einzelnd durchgehen und in $file schreiben
  foreach ($files as $file) {
    // Dem Dateinamen direkt den Ordner voransetzen, damit wir eine komplette
    // Pfadangabe haben (wird bspw. für filemtime() gebraucht)
    $file = $dir . $file;
    // Das Änderungsjahr der Datei ermitteln
    $file_year = date('Y', filemtime($file));

    // Hat die Datei ein anderes Änderungsjahr als das der aktuellen Gruppe
    // ($group_year), dann muss eine neue Gruppe angelegt werden
    if ($file_year <> $group_year) {
      // Sollte es sich nicht um die erste Gruppe (daher die 0) handeln, es
      // also schon eine andere Gruppe davor geben, dann die Zeilenumbrüche
      // ausgeben
      if ($group_year > 0) {
        echo '

';
      }
      // Die aktuelle Gruppe bekommt nun das Änderungsjahr der Datei
      $group_year = $file_year;
      // Jahr wird ausgegeben
      echo $group_year . '
';
    }

    // Dateiname, -datum, etc. ausgeben
    echo GetTitleFromHTML($file) . '
';
  }
?>

Luckie 13. Mär 2006 14:18

Re: [PHP] Dateiliste gruppieren
 
Ah. Jetzt hat es "klick" gemacht. ;) Besten Dank.

Pr0g 13. Mär 2006 14:20

Re: [PHP] Dateiliste gruppieren
 
Theoretisch könntest du nun in der Zeile vor Ausgabe des Dateinamens nochmal mit einem ähnlichen Codeblock ansetzen und das ganze wiederum nach Monaten untersortieren, aber das sollte ja nun leicht sein...

Luckie 13. Mär 2006 14:23

Re: [PHP] Dateiliste gruppieren
 
Ich denke das ist nicht nötig, so viel schreibe ich nun doch nicht in einem Monat. ;)

Luckie 27. Mär 2006 15:08

Re: [PHP] Dateiliste gruppieren
 
Ich schreibe wohl doch mehr. ;) Wie müsste ich das jetzt auch für die monate integrieren und kann man mit PHP den Monatsnamen irgendwie ausgeschrieben ausgeben lassen, dass man jetzt nicht immer abfragen müsste "ween 1 dann Januar, wenn 2 dann Feberuar" usw?

S2B 27. Mär 2006 15:36

Re: [PHP] Dateiliste gruppieren
 
versuchs mal so:
Code:
$monate = array(
  1 => 'Januar',
  2 => 'Februar',
  3 => 'März',
  4 => 'April',
  5 => 'Mai',
  [...]);

[...]

$dein_monat = $monate[$monat];
$monat ist dabei die "Monatszahl".

Luckie 27. Mär 2006 15:40

Re: [PHP] Dateiliste gruppieren
 
So was wollte ich eigentlcih vermeiden, aber mal gucken. Danke jedenfalls.

Hm, so ganz will es nicht, wie ich es mir vorstelle:
Code:
    // Dateien nach Jahren gruppiert ausgeben
    $group_year = 0;
    $group_month = 0;
    foreach ($files as $file)
    {
      $file = $dir . $file;
      $file_year = date('Y', filemtime($file));
      $file_month = date('m', filemtime($file));

      if ($file_year <> $group_year)
      {
        if ($group_year > 0)
        {
          echo "[/list]\n";
          if ($file_month <> $group_month)
          {
            if ($group_month > 0)
            {
              echo "

\n";
            }
            $group_month = $file_month;
            echo "

\n";
          }
          /*echo "

\n";*/
        }
        $group_year = $file_year;
        echo "<h4>$group_year</h4>\n";
        echo "<img src=\"/pics/divider.jpg\">\n";
        echo "<ul>\n";
      }
 
      $title = GetTitleFromHTML($file);
      echo "[*][".date("Y-m-d", filemtime($file))."] <a title=\"$title\" href=\"$file\">$title</a>\n";
    }
    echo "[/list]\n";
Wo ist da der Denkfehler? (Die Tags stimmen natürlich auch nioch nicht, das wäre dann mein nächstes Problem ;) )

DGL-luke 27. Mär 2006 15:53

Re: [PHP] Dateiliste gruppieren
 
In Delphi baust du dir doch auch lookup tables ;)

ansonsten wären mkdate() und date() deine freunde. das gibts die monantsnamen aber nur auf englisch.

[roter kasten] was da falsch ist weiss ich nicht....

EDIT: ach ja, "geht nicht" ist kein bugreport ;)

Luckie 27. Mär 2006 16:02

Re: [PHP] Dateiliste gruppieren
 
Es ändert sich nichts. Die dateien werden einfach nicht nach den Monaten gruppiert. :gruebel:

Luckie 27. Mär 2006 16:27

Re: [PHP] Dateiliste gruppieren
 
Nachtrag: Habe es etwas geschaft:
Code:
    // Dateien nach Jahren gruppiert ausgeben
    $group_year = 0;
    $group_month = 0;
    foreach ($files as $file)
    {
      $file = $dir . $file;
      $file_year = date('Y', filemtime($file));
      $file_month = date('m', filemtime($file));

      if (($file_year <> $group_year) || ($file_month <> $group_month))
      {
        if ($group_year > 0)
        {
          if ($file_month <> $group_month)
          {
            if ($group_month > 0)
            {
              echo "
\n";
            }
          }
          $group_month = $file_month;
        }
        echo "<h5>$file_month</h5>";
        $group_year = $file_year;
      }
      $title = GetTitleFromHTML($file);
      echo "[".date("Y-m-d", filemtime($file))."] <a title=\"$title\" href=\"$file\">$title</a></br>\n";
    }
Jetzt gruppiert er es mir nach Monaten aber wenn ich mir den Monat als Überschrift ausgeben lasse gruppiert er den ersten Eintrag noch extra, obwohl er zum März gehört. Und ich packe es nicht die Jahresüberschriften da reinzuschreiben. Er schreibvt sie mir immer überall drüber.

Nachtrag:
Code:
    // Dateien nach Jahren gruppiert ausgeben
    $group_year = 0;
    $group_month = 0;
    foreach ($files as $file)
    {
      $file = $dir . $file;
      $file_year = date('Y', filemtime($file));
      $file_month = date('m', filemtime($file));

      if (($file_year <> $group_year) || ($file_month <> $group_month))
      {
        if ($group_year > 0)
        {
          if ($file_month <> $group_month)
          {
            if ($group_month > 0)
            {
              echo "
\n";
            }
            $group_month = $file_month;
          }
        }
        $group_year = $file_year;
      }
      $title = GetTitleFromHTML($file);
      echo "[".date("Y-m-d", filemtime($file))."] <a title=\"$title\" href=\"$file\">$title</a></br>\n";
    }
So gruppiert er es mir wunderbar nach Gruppen, aber wenn ich jetzt die Überschriften einbauen will, stimmt die Gruppierung wieder nicht. :(

S2B 27. Mär 2006 17:20

Re: [PHP] Dateiliste gruppieren
 
Teste mal das:
Code:
// Dateien nach Jahren gruppiert ausgeben
    $group_year = 0;
    $group_month = 0;
    foreach ($files as $file)
    {
      $file = $dir . $file;
      $file_year = date('Y', filemtime($file));
      $file_month = date('m', filemtime($file));

      if ($file_year <> $group_year)
      {
        if ($group_year > 0)
        {
          echo "
\n";
        }
        echo "<h4>$file_year</h4>";
      }

      if ($file_month <> $group_month || $file_year <> $group_year)
      {
        if ($group_month > 0)
        {
          echo "
\n";
        }
        echo "<h5>$file_month</h5>";
      }

      $title = GetTitleFromHTML($file);
      echo "[".date("Y-m-d", filemtime($file))."] <a title=\"$title\" href=\"$file\">$title</a></br>\n";
    }

alcaeus 27. Mär 2006 17:29

Re: [PHP] Dateiliste gruppieren
 
Zitat:

Zitat von DGL-luke
das gibts die monantsnamen aber nur auf englisch.

Das wiederum kann man mit einem geeigneten Array und der Funktion strtr() leicht aendern ;)

Greetz
alcaeus

Luckie 27. Mär 2006 17:45

Re: [PHP] Dateiliste gruppieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt sieht es so aus, wie im Anhang. Die Jahre brauche ich nur, wenn auch ein neues Jahr anfängt.

So geht es:
Code:
    $group_year = 0;
    $group_month = 0;
    foreach ($files as $file)
    { 
      $file = $dir . $file;
      $file_year = date('Y', filemtime($file));
      $file_month = date('m', filemtime($file));

      if ($file_year <> $group_year)
      { 
        if ($group_year > 0)
        { 
          echo "
\n";
        } 
        echo "<h4>$file_year</h4>\n";
        echo "<img src=\"/pics/divider.jpg\">\n";
        $group_year = $file_year;
      }

      if (($file_month <> $group_month) || ($file_year <> $group_year))
      {
        if ($group_month > 0)
        {
          echo "
\n";
        }
        echo "<h5>$monate[$file_month]</h5>";
        $group_month = $file_month;
      } 

      $title = GetTitleFromHTML($file);
      echo "[".date("Y-m-d", filemtime($file))."] <a title=\"$title\" href=\"$file\">$title</a></br>\n";
    }
Jetzt ist nur das Problem, dass er mir nicht jedesmal den Monatsnamen hinschreibt, obwohl die Zahl stimmt.

Luckie 27. Mär 2006 18:40

Re: [PHP] Dateiliste gruppieren
 
So passt es:
Code:
    // Dateien nach Jahren gruppiert ausgeben
    $group_year = 0;
    $group_month = 0;
    foreach ($files as $file)
    { 
      $file = $dir . $file;
      $file_year = date('Y', filemtime($file));
      $file_month = date('m', filemtime($file));

      if ($file_year <> $group_year)
      {
        if ($group_year > 0)
        {
          echo "
\n";
        }
        echo "[/list]\n";
        echo "<h4>$file_year</h4>\n";
        echo "<img src=\"/pics/divider.jpg\">\n";
        $group_year = $file_year;
      }

      if (($file_month <> $group_month) || ($file_year <> $group_year))
      {
        if ($group_month > 0)
        {
          /*echo "[/list]\n";*/
        }
        echo "[/list]\n";
        echo "<h5>".date("M", filemtime($file))."</h5>\n";
        echo "<ul>\n";
        $group_month = $file_month;
      }

      $title = GetTitleFromHTML($file);
      echo "[*]<a title=\"$title\" href=\"$file\">$title</a></br>\n";
    }
    echo "[/list]\n";
Und jetzt nur noch die Monate vollausgeschrieben. ;)

alcaeus 27. Mär 2006 18:43

Re: [PHP] Dateiliste gruppieren
 
Zitat:

Zitat von Luckie
Und jetzt nur noch die Monate vollausgeschrieben. ;)

Und spaetestens da musst du in irgendeiner Form auf ein array zurueckgreifen, wenn du diese nicht in Englisch haben willst. Ansonsten hat dir DGL_Luke wohl schon die Antwort gegeben.

Greetz
alcaeus

Luckie 27. Mär 2006 18:49

Re: [PHP] Dateiliste gruppieren
 
mkdate finde ich in der PHP Refrenz nicht und für date gibt es als Formatbeschreiber nur den Monat mit drei Buchstaben, so wie ich ihn schon habe. Ups steht weiter oben in der Tabelle "F" ist es. ;)

Und so
Code:
    $monate = array(
      01 => 'Januar',
      02 => 'Februar',
      03 => 'Maerz',
      04 => 'April',
      05 => 'Mai',
      06 => 'Juni',
      07 => 'Juli',
      08 => 'August',
      09 => 'September',
      10 => 'Oktober',
      11 => 'November',
      12 => 'Dezember'
    );

echo "[/list]\n";
        echo date("m", filemtime($file));
        echo "<h5>".$monate[date("m", filemtime($file))]."</h5>\n";
        echo "<ul>\n";
        $group_month = $file_month;
scheint e rmir nur mal einen Monat auszugeben, wenn er Lust hat, obwohl die Monate nummerisch korrekt ausgegeben werden.

S2B 27. Mär 2006 18:52

Re: [PHP] Dateiliste gruppieren
 
Nimm die Monate ohne Nullen am Anfang... :wink:

Luckie 27. Mär 2006 18:56

Re: [PHP] Dateiliste gruppieren
 
Ächtz, warum klappt denn das aufeinmal? Kommt er dann mit dem Array nicht klar?

Hier ist nun unser gemeinsames Werk: http://www.michael-puff.de/Developer/Artikel/ ;)

DGL-luke 27. Mär 2006 22:44

Re: [PHP] Dateiliste gruppieren
 
Im Firefox waren die Monatsnamen grad noch nicht mit im Rahmen, du Schlingel du!

Mit jedem Reload wirds schöner... wenn das doch bei meinen Eigenentwicklungen auch so wär :mrgreen:

Aber den Januar kriegst du wohl vom Dezember des Vorjahres nicht mehr weg :lol:

aber das mit dem array kann ich nicht nachvollziehen... ich nehme mal an, das wird gleich in einen string übertragen. Schon fast einen bugreport wert... oder ist das "expected behaviour"?

EDIT: naja, gute nacht dann mal.

Luckie 27. Mär 2006 22:48

Re: [PHP] Dateiliste gruppieren
 
Jetzt ist es fertig, aber ich weiß nicht, ob es mir besser gefällt. :?

Ich glaube da smit den Tabellen war auch etwas blöd. So bleibt es jetzt, denke ich. ;)

Chewie 28. Mär 2006 08:09

Re: [PHP] Dateiliste gruppieren
 
Zahlen mit Null am Anfang sind Oktalzahlen, Luckie ;)

Luckie 28. Mär 2006 08:17

Re: [PHP] Dateiliste gruppieren
 
Zitat:

Zitat von Chewie
Zahlen mit Null am Anfang sind Oktalzahlen, Luckie ;)

Blödes PHP. http://www.michael-puff.de/files/mecker.gif


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz