![]() |
[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?
|
Re: [PHP] Dateiliste gruppieren
Hi Michael
Meine Gegenfragen:
mfG, titus |
Re: [PHP] Dateiliste gruppieren
Es ist eine Dateiliste vom Dateisystem:
![]() |
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 |
Re: [PHP] Dateiliste gruppieren
Genau so was...
Code:
...wollte ich eigentlich vermeiden.
$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"; } |
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 |
Re: [PHP] Dateiliste gruppieren
Und eben genau das wollte ich wissen, wie man das löst. ;)
|
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:
Ließe sich sicher auch leicht an Monate anpassen etc.
<?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/')); ?> mfG |
Re: [PHP] Dateiliste gruppieren
Ich habe es erstmal hardgecodet. Ändern muss ich es ja immer nur einmal im Jahr. ;)
![]() Sieht ganz schick aus, wie ich finde. ;) |
Re: [PHP] Dateiliste gruppieren
Zitat:
Zitat:
mfG |
Re: [PHP] Dateiliste gruppieren
Jupp, wenn ich wieder Zeit und Lust habe. Versprochen.
|
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("."); |
Re: [PHP] Dateiliste gruppieren
Da habe ich dann aber nur eine sortierte List und keine gruppierte oder?
|
Re: [PHP] Dateiliste gruppieren
Na, irgendwas musst du ja auch noch selbst machen. :mrgreen:
|
Re: [PHP] Dateiliste gruppieren
Sortieren ist ja kein Problem, das kann ich ja schon. ;)
|
Re: [PHP] Dateiliste gruppieren
Ich habe den Code aus
![]()
Code:
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...
<?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) . ' '; } ?>
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] ------------------------------------ |
Re: [PHP] Dateiliste gruppieren
Das ist gemial und funktioniert. :P So schön kurz. :thumb: Ich verstehe den Code nur noch nicht ganz. :gruebel:
|
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) . ' '; } ?> |
Re: [PHP] Dateiliste gruppieren
Ah. Jetzt hat es "klick" gemacht. ;) Besten Dank.
|
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...
|
Re: [PHP] Dateiliste gruppieren
Ich denke das ist nicht nötig, so viel schreibe ich nun doch nicht in einem Monat. ;)
|
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?
|
Re: [PHP] Dateiliste gruppieren
versuchs mal so:
Code:
$monat ist dabei die "Monatszahl".
$monate = array(
1 => 'Januar', 2 => 'Februar', 3 => 'März', 4 => 'April', 5 => 'Mai', [...]); [...] $dein_monat = $monate[$monat]; |
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:
Wo ist da der Denkfehler? (Die Tags stimmen natürlich auch nioch nicht, das wäre dann mein nächstes Problem ;) )
// 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"; |
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 ;) |
Re: [PHP] Dateiliste gruppieren
Es ändert sich nichts. Die dateien werden einfach nicht nach den Monaten gruppiert. :gruebel:
|
Re: [PHP] Dateiliste gruppieren
Nachtrag: Habe es etwas geschaft:
Code:
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.
// 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"; } Nachtrag:
Code:
So gruppiert er es mir wunderbar nach Gruppen, aber wenn ich jetzt die Überschriften einbauen will, stimmt die Gruppierung wieder nicht. :(
// 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"; } |
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"; } |
Re: [PHP] Dateiliste gruppieren
Zitat:
Greetz alcaeus |
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:
Jetzt ist nur das Problem, dass er mir nicht jedesmal den Monatsnamen hinschreibt, obwohl die Zahl stimmt.
$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"; } |
Re: [PHP] Dateiliste gruppieren
So passt es:
Code:
Und jetzt nur noch die Monate vollausgeschrieben. ;)
// 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"; |
Re: [PHP] Dateiliste gruppieren
Zitat:
Greetz alcaeus |
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:
scheint e rmir nur mal einen Monat auszugeben, wenn er Lust hat, obwohl die Monate nummerisch korrekt ausgegeben werden.
$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; |
Re: [PHP] Dateiliste gruppieren
Nimm die Monate ohne Nullen am Anfang... :wink:
|
Re: [PHP] Dateiliste gruppieren
Ächtz, warum klappt denn das aufeinmal? Kommt er dann mit dem Array nicht klar?
Hier ist nun unser gemeinsames Werk: ![]() |
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. |
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. ;) |
Re: [PHP] Dateiliste gruppieren
Zahlen mit Null am Anfang sind Oktalzahlen, Luckie ;)
|
Re: [PHP] Dateiliste gruppieren
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz