newline
Goto Top

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.
<!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

Content-Key: 665679

Url: https://administrator.de/contentid/665679

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: StefanKittel
StefanKittel 13.04.2021 um 10:27:22 Uhr
Goto Top
Hallo,

Ich würde die Liste einlesen und in einer Tabelle einer Datenbank ablegen.
Dort kann man viel einfacher filtern, sortieren und gruppieren.

Stefan
Mitglied: em-pie
em-pie 13.04.2021 aktualisiert um 13:14:23 Uhr
Goto Top
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
[...]
x = rows[i].getElementsByTagName("TD");  
y = rows[i + 1].getElementsByTagName("TD");  
[...]
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:
<!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
Mitglied: newline
newline 13.04.2021 um 14:16:14 Uhr
Goto Top
Auch wenn ich natürlich lieber ein cooles Datenbank-Tableau nutzen würde, so habe ich hier im Forum gesehen, dass der Fragesteller dazu schon einmal seinen grundsätzlichen Code vorstellt. In Bezug dazu kann ich leider nichts vorweisen, sodass ich doch zu quick & dirty tendiere, zumal die Sortierung durch den Anwender vollkommen ausreichend wäre!
Ich danke euch also für eure Tipps und Hinweise!

@em-pie:
Lösung 3 sagt mir sehr zu. Nun ist zur Sortierung ja eine feste, vorgegebene Tabelle vorhanden.
Wie stelle ich es aber an, dass meine Dateien aus dem Verzeichnis in der Art dargestellt werden?
Und, was muss in den Dateien hinterlegt sein, dass sie sich so sortieren lassen (Stw. Gruppierung):
Also alle Dateien mit definierter Gruppe 5 oder alle mit Gruppe 13 usw.