PHP Inhalt von Unterordnern "step by step" auslesen

Hallo !

Ich habe hier aktuell ein Problem, wo ich irgendwie nicht weiterkomme.

Ich habe einen Ordner images, der beliebig viele Unterordner haben kann. Jeder Unterordner kann wieder beliebig viele Unterordner haben.

Ich möchte mit nun die Bilder ( dort sind nur Bilder ) anzeigen, aber immer nur 20 Stück, damit die Ladezeit nicht zu hoch ist.

- images
-- ordner_1
---- image_1
---- image_2
---- image_3
-- ordner_2
-- ordner_2_1
---- image_1
-- ordner_2-2
---- image_1
---- image_2

usw. ! Wie kann ich nun am besten immer in 20er Schritten durchgehen. Ich will nicht immer von vorne anfangen und dann zählen. Hat jemand eine Idee ?
 
wie wäre es mit PHP und einer Zählergesteuerten Schleife?

müsste grade selber nachlesen wie der genaue Code dafür ist, bin grad a weng angerostet was PHP angeht ;-)

Oder was genau soll gemacht werden, vielleicht motivier ich mich ja und mach was ^^

greetz
chris
 
Ich habe mir sowas mal spaßeshalber zusammengebaut:

Du musst nur diese Funktion entsprechend beschränken. Wobei sie so schon auf meiner Testkiste um die 300-400 Ordner in 10-20 Sekunden ausließt.

OpenFile ist eine Funktion, die einfach eine Datei öffnet und ihren Inhalt zurückgibt.

Code:
<?php

    function get_content($dir, $instance=0)
        {
            $dirs = glob($dir."/*", GLOB_ONLYDIR);
            $retFiles = "";
            $stats_ressources_bit_file_html = OpenFile("result_bit_file.html");
            $stats_ressources_bit_dir_html = OpenFile("result_bit_dir.html");

            if(!isset($_SESSION['stats_ressources']['DirSize']) || $instance == 0)
                { $_SESSION['stats_ressources']['DirSize'] = 0; }

            $next_instance = $instance+1;
            $handle = opendir($dir);
            while ($file = readdir ($handle))
                {
                    if($file != "." && $file != "..")
                        {
                            #Feststellen ob Ordner
                            $isDir = FALSE;
                            foreach($dirs as $dirIndex => $dirValue)
                                {
                                    $tempDirName = $dirValue;
                                    while(strpos($tempDirName, "/") !== FALSE)
                                        {   $tempDirName = substr($tempDirName, (strpos($tempDirName, "/")+1)); }

                                    if($tempDirName == $file)
                                        {
                                            $isDir = TRUE;
                                            $nextDir = $dirValue;
                                        }
                                }

                            $space = "";
                            $instance_counter = 0;
                            while($instance_counter < $instance)
                                {
                                    $space .= "  -  ";
                                    $instance_counter++;
                                }

                            if($isDir)
                                {
                                    $retFiles .= $stats_ressources_bit_dir_html;
                                    $retFiles = str_replace("%FILENAME%","<i>".$space.$file."</i>",$retFiles);
                                    $retFiles = str_replace("%FILETYPE%","DIR",$retFiles);
                                    $retFiles = str_replace("%FILESIZE%"," ",$retFiles);
                                    $retFiles .= get_content($nextDir,$next_instance);
                                }
                            else
                                {
                                    $retFiles .= $stats_ressources_bit_file_html;
                                    $retFiles = str_replace("%FILENAME%",$space.$file,$retFiles);
                                    $retFiles = str_replace("%FILETYPE%","FILE",$retFiles);
                                    $retFiles = str_replace("%FILEPATH%",$dir."/".$file,$retFiles);

                                    $unitCounter = 0;
                                    $filesize = filesize($dir."/".$file);
                                    while($filesize > 1024)
                                        {
                                            $filesize = $filesize / 1024;
                                            $unitCounter++;
                                        }

                                    if($unitCounter == 0)   { $unit = "B"; }
                                    if($unitCounter == 1)   { $unit = "KB"; }
                                    if($unitCounter == 2)   { $unit = "MB"; }
                                    if($unitCounter == 3)   { $unit = "GB"; }
                                    if($unitCounter == 4)   { $unit = "TB"; }
                                    if($unitCounter == 5)   { $unit = "PB"; }

                                    $filesize = round($filesize,2);

                                    $retFiles = str_replace("%FILESIZE%",$filesize." ".$unit,$retFiles);
                                    $_SESSION['stats_ressources']['DirSize'] += filesize($dir."/".$file);
                                }
                        }
                }

            closedir($handle);

            return $retFiles;
        }

?>

result_bit_file.html

Code:
<tr style="background-color:red;">
    <td style="border-bottom:1px dashed black;"><b><i>%FILENAME%</i></b></td>
    <td style="border-bottom:1px dashed black; border-right:1px solid black;">%FILETYPE%  </td>
    <td colspan="2" style="border-bottom:1px dashed black;">%FILESIZE%</td>
</tr>

result_bit_dir.html


Code:
<tr>
    <td style="border-bottom:1px dashed black;">%FILENAME%</td>
    <td style="border-bottom:1px dashed black; border-right:1px solid black;">%FILETYPE%  </td>
    <td style="border-bottom:1px dashed black;">%FILESIZE%</td>
</tr>

result.html (die HTML wo die Bits nachher eingesetzt werden)
Code:
<br><br>
<center>
<table style="border:1px solid black; text-align: left; background-color: rgb(255, 153, 0);" border="0" cellpadding="4" cellspacing="0">
    <!-- #id 	userid 	ip 	time 	actionid 	data 	USI 	moduleid -->
    <tr>
        <td>
            Gesamtgröße %SUMSIZE%
        </td>
    </tr>
    <tr>
        <td style="border-right:1px dashed black;" valign="top">
            <div>
                <table>
                    <tr>
                        <td style="border-bottom:1px solid black;"><b>Titel</b></td>
                        <td style="border-bottom:1px solid black;"><b>Typ</b></td>
                        <td style="border-bottom:1px solid black;"><b>Größe</b></td>
                        <td style="border-bottom:1px solid black;"><b>Optionen</b></td>
                    </tr>
                    <!-- RESSOURCES -->
                        %RESSOURCES%
                    <!-- /RESSOURCES -->
                </table>
            </div>
        </td>
    </tr>
</table>

Keine Garantien :)

Bug: Wenn es zu viel wird, kannst du natürlich auf nen Timeout oder ein Memory Exceeded laufen!

lG
 
Zuletzt bearbeitet:
meine idee dazu wäre die einrichtung einer (totalen) ordnung, und ein positions parameter...

der positionsparameter kann beispielsweise der pfad des ersten elements (bildes) sein ...

die (totale) ordnung sorgt dafür, dass man aus der gesammtheit aller elemente (bilder) eine eindeutige abfolge bilden kann

beispielsweise könnte man die pfadangaben lexikalisch betrachten und ordner grundsätzlich vor dateien wählen

in diesem fall könnte das so aussehen:

wir haben 3 Ordner A,B und C

A enthält die bilder a1, a2 und a3
B enthält die unterordner BA und BB sowie die bilder b1, b2 und b3
BA enthält das bild ba1
BB enthält das bild bb1
C enthält die bilder c1 und c2

haben wir nun als ordnung die lexikalische betrachtung der pfade und als position B\BA\ba1 wäre es möglich nun in der struktur die nächsten x elemente zu suchen und auszugeben:

dazu betrachtet man die position (B\BA\ba1)

das nächste element in der reihenfolge wäre die datei aus B\BA die lexikalisch größer ist als ba1 ... diese existiert nicht, somit ist das verzeichnis B\BA durch ... wir gehen im positions pfad auf die nächst höhere ebene, und sind beim verzeichnis B\BA das wir gerade abgeharkt haben da es ein verzeichnis in B gibt, das lexikalisch größer ist als BA (BB) geht es dort weiter ... das verzeichnis B\BB hat keine unterverzeichnisse, demnach suchen wir die erste (lexikalisch kleinste) datei bb1 ... das nächste element für die ausgabe wurde gefunden

es ist nach einem derartigen schema relativ einfach eine funktion zu schreiben, die dir für ein gegebenes element das nächste gibt...

das traversieren der gesammten struktur ist mit einer solchen funktion problemlos, führt jedoch zu einer nicht unerheblichen zahl an IO operationen, wenn das paralell viele user machen... für wenige user würde das bereits reichen ...

braucht man das ganze in performant, wäre es angebracht sich eine art cache für die ordnung zu bauen (also quasi eine verkettete liste für die einzelnen pfade, und eine hashtable die zu jedem pfad den jeweiligen eintrag in der liste auflösen kann) ... diesen cache kann man mit der oben beschriebenen methodik befüllen, und auch relativ problemlos erweitern wenn neue einträge hinzukommen/alte gelöscht werden, etc ...
 
Zurück
Oben