Php: Gruppierung von Dateien ?!?
Hallo zusammen,
ein Verzeichnis enthält eine variable Ansammlung von Dateien. Eine Gruppierung ist weder durch
- Größe
- Dateiname
- Dateiendung
in meinem Fall sinnvoll!
Da ich verschiedene Gruppierungen vornehmen möchte habe ich mir überlegt, in den Dateien einen jeweiligen Bereich zu reservieren, diesen auszulesen und dadurch die Dateien gruppieren zu können (vermutlich gibt es elegantere und praktikablere Lösungen ...).
Bei mir funktioniert es zumindest einigermaßen. Leider werden die Dateinamen immer doppelt aufgeführt.
Ich habe einige Fragen:
Wie lässt sich die Doppelung der Dateinamen verhindern?
Es ist vermutlich keine gute Idee fRead auf 100000 hoch zu setzen (maximaler Fall). Dies ist allerdings aufgrund der Anzahl an aufgelisteten Gruppen (mir) nicht anders möglich. Leider weiß ich nicht wie ...
Ich hätte gerne eine sortierte Auflistung. Momentan werden die Dateien unsortiert aufgelistet.
PS: Das Beispiel-Konstrukt enthält 60 Gruppen. Für meine Gruppierungen würde ich die Dateien zur Sortierung nur mit den jeweils notwendigen Gruppen ausstatten.
Dabei kann es sein, dass eine Datei zugehörig ist zu den Gruppen 01, 05, 26 und 30 eine andere zu den Gruppen 01, 50, und 55.
Die Auflistung sollte dann so sein:
Gruppe 01:
Datei 10
Datei 25
Datei 26
Datei 27
Gruppe 12:
Datei 10
Datei 33
usw.
Ok, hier zunächst das Dateigerüst der variablen Dateien.
Zum Auslesen und Auflisten (einer Gruppe) bin ich soweit:
Gruß newline
ein Verzeichnis enthält eine variable Ansammlung von Dateien. Eine Gruppierung ist weder durch
- Größe
- Dateiname
- Dateiendung
in meinem Fall sinnvoll!
Da ich verschiedene Gruppierungen vornehmen möchte habe ich mir überlegt, in den Dateien einen jeweiligen Bereich zu reservieren, diesen auszulesen und dadurch die Dateien gruppieren zu können (vermutlich gibt es elegantere und praktikablere Lösungen ...).
Bei mir funktioniert es zumindest einigermaßen. Leider werden die Dateinamen immer doppelt aufgeführt.
Ich habe einige Fragen:
Wie lässt sich die Doppelung der Dateinamen verhindern?
Es ist vermutlich keine gute Idee fRead auf 100000 hoch zu setzen (maximaler Fall). Dies ist allerdings aufgrund der Anzahl an aufgelisteten Gruppen (mir) nicht anders möglich. Leider weiß ich nicht wie ...
Ich hätte gerne eine sortierte Auflistung. Momentan werden die Dateien unsortiert aufgelistet.
PS: Das Beispiel-Konstrukt enthält 60 Gruppen. Für meine Gruppierungen würde ich die Dateien zur Sortierung nur mit den jeweils notwendigen Gruppen ausstatten.
Dabei kann es sein, dass eine Datei zugehörig ist zu den Gruppen 01, 05, 26 und 30 eine andere zu den Gruppen 01, 50, und 55.
Die Auflistung sollte dann so sein:
Gruppe 01:
Datei 10
Datei 25
Datei 26
Datei 27
Gruppe 12:
Datei 10
Datei 33
usw.
Ok, hier zunächst das Dateigerüst der variablen Dateien.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
...
</head>
<body>
<!--
<gruppe01>IDTAG 01</gruppe01>
<gruppe02>IDTAG 02</gruppe02>
...
<gruppe60>IDTAG 60</gruppe60>
-->
...
</body>
</html>
Zum Auslesen und Auflisten (einer Gruppe) bin ich soweit:
<?php
$verzeichnisname = ".";
$verzeichnis = openDir($verzeichnisname);
while ($file = readDir($verzeichnis)) {
if (strstr($file, ".php")) {
$datei = fOpen($verzeichnisname . "/" . $file, "r");
$inhalt = fRead($datei, 1000000);
fClose($datei);
preg_match('/<gruppe60>(.*?)<\/gruppe60>/i', $inhalt, $titel);
echo '<a href="' . $verzeichnisname . '/' . $file . '">' . implode("", $titel) . '</a><br>';
unset($titel[1]); // Titeltext löschen
}
}
closeDir($verzeichnis);
?>
Gruß newline
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 665679
Url: https://administrator.de/forum/php-gruppierung-von-dateien-665679.html
Ausgedruckt am: 13.03.2025 um 19:03 Uhr
3 Kommentare
Neuester Kommentar
Moin,
alternativ zu dem Vorschlag des Kollegen @StefanKittel
Arbeite mit JavaScript und Datagrids (schöner aber aufwendiger):
https://js.devexpress.com/Documentation/ApiReference/UI_Components/dxDat ...
Oder lies erst alles in ein Mehrdimensionales Array ein. sortiere das Array und nutze es dann für die Ausgabe:
https://www.php.net/manual/de/function.sort.php
Edit: Es ginge auch so:
https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_sort_table
Die Ziffer in der letzten Eckigen Klammer gibt die Spalte an, 0 = erste Spalte, 1 = zweite Spalte, 3 = dritte Spalte ...
fügst du in jedem Spaltenkopf einen Button ein, der die Funktion "sort table" aufruft, und übergibst als Parameter die Spaltenid, so kann der Anwender selbst sortieren.
Ist zwar etwas Quick & Dirty, aber schnell umgesetzt.
edit3:
Auf Basis des W3schools-Beispiels:
Statt der normalen Buttons kann man auch Icons einsetzen...
Gruß
em-pie
alternativ zu dem Vorschlag des Kollegen @StefanKittel
Arbeite mit JavaScript und Datagrids (schöner aber aufwendiger):
https://js.devexpress.com/Documentation/ApiReference/UI_Components/dxDat ...
Oder lies erst alles in ein Mehrdimensionales Array ein. sortiere das Array und nutze es dann für die Ausgabe:
https://www.php.net/manual/de/function.sort.php
Edit: Es ginge auch so:
https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_sort_table
[...]
x = rows[i].getElementsByTagName("TD");
y = rows[i + 1].getElementsByTagName("TD");
[...]
fügst du in jedem Spaltenkopf einen Button ein, der die Funktion "sort table" aufruft, und übergibst als Parameter die Spaltenid, so kann der Anwender selbst sortieren.
Ist zwar etwas Quick & Dirty, aber schnell umgesetzt.
edit3:
Auf Basis des W3schools-Beispiels:
<!DOCTYPE html>
<html>
<head>
<title>Sort a HTML Table Alphabetically</title>
<style>
table {
border-spacing: 0;
width: 100%;
border: 1px solid #ddd;
}
th, td {
text-align: left;
padding: 16px;
}
tr:nth-child(even) {
background-color: #f2f2f2
}
</style>
</head>
<body>
<p>Click the button to sort the table alphabetically, by name:</p>
<p><button onclick="sortTable(0)">Sort 1</button>
<button onclick="sortTable(1)">Sort 2</button></p>
<table id="myTable">
<tr>
<th>Name <button onclick="sortTable(0)">Sort 1</button> </th>
<th>Country <button onclick="sortTable(1)">Sort 2</button></th>
</tr>
<tr>
<td>Berglunds snabbkop</td>
<td>Sweden</td>
</tr>
<tr>
<td>North/South</td>
<td>UK</td>
</tr>
<tr>
<td>Alfreds Futterkiste</td>
<td>Germany</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Germany</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti</td>
<td>Italy</td>
</tr>
<tr>
<td>Paris specialites</td>
<td>France</td>
</tr>
<tr>
<td>Island Trading</td>
<td>UK</td>
</tr>
<tr>
<td>Laughing Bacchus Winecellars</td>
<td>Canada</td>
</tr>
</table>
<script>
function sortTable($int) {
var table, rows, switching, i, x, y, shouldSwitch;
table = document.getElementById("myTable");
switching = true;
/*Make a loop that will continue until
no switching has been done:*/
while (switching) {
//start by saying: no switching is done:
switching = false;
rows = table.rows;
/*Loop through all table rows (except the
first, which contains table headers):*/
for (i = 1; i < (rows.length - 1); i++) {
//start by saying there should be no switching:
shouldSwitch = false;
/*Get the two elements you want to compare,
one from current row and one from the next:*/
x = rows[i].getElementsByTagName("TD")[$int];
y = rows[i + 1].getElementsByTagName("TD")[$int];
//check if the two rows should switch place:
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
//if so, mark as a switch and break the loop:
shouldSwitch = true;
break;
}
}
if (shouldSwitch) {
/*If a switch has been marked, make the switch
and mark that a switch has been done:*/
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
switching = true;
}
}
}
</script>
</body>
</html>
Statt der normalen Buttons kann man auch Icons einsetzen...
Gruß
em-pie