[PHP] Array sortieren

chris47803

Cadet 4th Year
Registriert
Apr. 2007
Beiträge
64
Hallo!

Ich lese mit folgendem Script die Daten aus einem Verzeichnis.

PHP:
//FTP-Verbundungsdaten
 $ftpverbindung = ftp_connect("Adresse");
 ftp_login($ftpverbindung,"Name","Passwort");


//Verzeichnis 1
echo "<b>Verzeichnisname</b><br>";
chdir ('/Verzeichnis/');
$einzel_titel = getcwd();
$verzeichnis1 = dir($einzel_titel);
while($eintrag = $verzeichnis1->read())
echo "$eintrag<br>". date ("d m Y - ", filemtime($eintrag));

Dadurch bekomme ich folgende Ausgabe.

21 04 2007 - Dateiname 01
24 02 2007 - Dateiname 02
27 01 2007 - Dateiname 03
u.s.w.

Wie kann die diese Ausgabe nun nach dem Datum sortieren?
Ich habe es schon mit sort() etc versucht, aber keinen Erfolg gehabt.

Danke, Chris
 
Zuletzt bearbeitet:
AW: Array sortieren

Wenn du den Thread wie vorgesehen mit zB [VB-Script] o.ä. angefangen hättest wüssten wir vielleicht auch um was für eine Sprache es sich handelt und könnten dir helfen...
mfg Backslash
 
AW: Array sortieren

Hallo!

Sorry Backslash, hatte ich vergessen.
Es geht um PHP.

@zatarc
Daran habe ich mich ja bereits versucht, bekomme es aber nicht hin.

Wie baue ich es in mein Script ein?

Danke, Chris
 
AW: Array sortieren

Das Problem ist, dass dein Array zwar schon richtig sortiet wird, aber eben nur nach der ersten Zahl, also in diesem Fall nach dem Tag.
Dir bleibt also nur entweder mit uksort einen eigenen Vergleich zu basteln oder das Datumsformat zu JJJJMMTT zu ändern.

mfg Backslash
 
filemtime() liefert bereits einen UNIX-Timestamp, aus den formatierten Daten wieder UNIX-Timestamps zu generieren wäre irgendwie ineffizient... ;)

@chris47803
Schmeiß die Dateinamen und mtimes in ein Array und sortiere dieses mittels usort():
PHP:
$verzeichnis1 = dir($einzel_titel);
$tmp = array();
while ($eintrag = $verzeichnis1->read())
  $tmp[] = array($eintrag, filemtime($eintrag));
$verzeichnis1->close();

usort($tmp, create_function('$a,$b', 'return $a[1] < $b[1] ? -1 : ($a[1] > $b[1] ? 1 : 0);'));

foreach ($tmp as $eintrag)
  echo date('d m Y - ', $eintrag[1]), $eintrag[0], '<br>';

greetings, Keita
 
Stimmt, die Code hab ich mir oben gar nicht richtig angesehen. Einfach den Timestamp anstatt des formatierten Datums in das Array speichern. Hab irgendwie gedacht, dass das formatierte Datum so geben ist.
 
Vielen Dank an Keita.

Deine Lösung funktioniert perfekt.
Ich musste lediglich die Sortierung umkehren, damit die Neusten oben stehen.

Nun habe ich dazu noch einige Fragen.........:D

In der Ausgabe habe ich auch das Dateum vom Verzeichnis stehen
und zwar steht dort nicht der Verzeichnisname, sondern nur . oder..
also nur ein, oder zwei Punkte.
Diese Ausgabe möchte ich nicht, oder es soll der Verzeichnisname dort stehen.
Ist das möglich?

Was noch super wäre..............
Ist es möglich über ein IF-Abfrage nur die Daten auszugeben, die nicht älter
als z.B. 30 Tage sind?

Vielen Dank, Chris
 
"." oder ".." sind keine Ordner, sondern Links.
"." führt zum Rootverzeichnis und ".." zum vorherigen Verzeichnis.

Wenn du sie nicht dortstehen haben möchstest, dann tu doch folgendes

PHP:
if($file != '.' and $file != '..') {
    # Verzeichnisse / Dateien auflisten
    ...
}

zum zweiten Problem: ja klar, wieso nicht?

PHP:
$jetzt = time(); # aktueller Timestamp = Vergangene Sekunden seit 1.1.1970
$vor_30_tagen = $jetzt - 2592000; # (60sec * 60min * 24h * 30d = 2592000sec)

if (filemtime($file) > $vor_30_tagen) {
    # Verzeichnisse / Dateien auflisten
    ...
}
 
Zuletzt bearbeitet:
Ganz herzlichen Dank, ihr seid hier echt die Besten. :schluck: :n8:
 
Hallo!

Ich habe nun noch die Funktion "filesize" mit in mein Script genommen.
Das geht bei Dateien auch wunderbar, aber bei Verzeichnissen wird
mir keine Größe ausgegeben.
Es geht also darum, das ich in einen Verzeichnis nur die Verzeichnisnamen
ausgeben lasse.
Gibt es da keine Funktion für?

Danke, Chris
 
Hallo!

Leider habe ich es immer noch nicht geschafft.

Das folgende Script gibt mir, vom angegbenen Verzeichnis die gesamte Größe aus.

PHP:
<?
function dir_size($dir, $size = 0) {
    $handle = opendir($dir);

    while ($file = readdir($handle)) {
        if ($file == '.' || $file == '..') continue;

        $full_path = $dir.$file;

        if (is_dir($full_path)) {
            $size = dir_size($full_path.'/', $size);
        } else {
            $size += filesize($full_path);
        }
    }

    closedir($handle);

    return $size;
}
?>

<?
$path = "/Verzeichnis/"; // vom Pfad der aktuellen Datei ausgehen
$size = dir_size($path);
$size = round (($size/1024/1024),2);
echo "<p>Der Ordner $path belegt insgesamt $size MB.</p>";
?>

Das nutzt mir aber leider nichts.

Gibt es denn da keine Möglichkeit?

Ich möchte gerne von jedem einzelnen Verzeichnis, das sich in diesem Verzeichnis befindet,
die Größe ermitteln.

Danke, Chris
 
Bei mir funktioniert das Script ohne Probleme ... gibts eine Fehlermeldung?
 
Das o.g. Script funktioniert schon, aber ich möchte nicht die Größe
von allen Verzeichnissen gesamt, sonder von jedem einzeln haben.

Chris
 
//edit:

Im falschen Thread gepostet ^^
 
Zuletzt bearbeitet:
Ich habe das mal ein bisschen angepasst.
PHP:
<?
$dirs_size = array();

function dir_size($dir) {
	global $dirs_size;
	$complete_size = __dir_size($dir);
	$top_dir = array('dir' => $dir, 'size' => $complete_size);
	array_unshift($dirs_size, $top_dir);
	return $dirs_size;
}

function __dir_size($dir, $complete_size = 0) {
	global $dirs_size;
    $handle = opendir($dir);

    while ($file = readdir($handle)) {
        if ($file == '.' || $file == '..') continue;

        $full_path = $dir.$file;

        if (is_dir($full_path)) {
        	$size_before = $complete_size;
            $complete_size = __dir_size($full_path.'/', $complete_size);
            $size = $complete_size - $size_before;
            $dirs_size[] = array('dir' => $full_path, 'size' => $size);
        } else {
            $complete_size += filesize($full_path);
        }
    }

    closedir($handle);
    
    return $complete_size;
}
?>

Die Funktion dir_size gibt jetzt ein mehrschichtiges Array mit allen Unterordnern zurück.

Zum Beispiel:
PHP:
$path = './phpmyadmin';
$foo  = dir_size($path);

print_r($foo); # Array-Inhalt ausgeben

#######################################################
# Ausgabe

Array
(
    [0] => Array # Der oberste Ordner hat _immer_ den Index 0!
        (
            [dir] => ./phpmyadmin/ # Verzeichnisname 
            [size] => 9778823 # Größe in Bytes
        )

    [1] => Array
        (
            [dir] => ./phpmyadmin/scripts
            [size] => 75752
        )

    [2] => Array
        (
            [dir] => ./phpmyadmin/css
            [size] => 17565
        )

    [3] => Array
        (
            [dir] => ./phpmyadmin/js
            [size] => 87708
        )

    [4] => Array
        (
            [dir] => ./phpmyadmin/lang
            [size] => 3909468
        )

    [5] => Array
        (
            [dir] => ./phpmyadmin/libraries/import
            [size] => 30937
        )

    [6] => Array
        (
            [dir] => ./phpmyadmin/libraries/export
            [size] => 122844
        )
    ....
)
 
Zuletzt bearbeitet:
Ich blick grad nicht durch dein Array durch, aber ich würde das Array so gestalten:

PHP:
Array
(
    [9778823] => ./phpmyadmin/
    [75752] => ./phpmyadmin/scripts
    [17565] => ./phpmyadmin/css
    [87708] => ./phpmyadmin/js
    [3909468] => ./phpmyadmin/lang
    [30937] => ./phpmyadmin/libraries/import
    [122844] => ./phpmyadmin/libraries/export
)

Dann kannst du doch einfach mit array_search nach ./phpmyadmin/ suchen und bekommst 9778823 ausgegeben. Das ganze nun in ne Schleife und gut is.

MfG r15ch13
 
Und was passiert, wenn zwei Verzeichnisse die gleiche Größe haben…? ;)

greetings, Keita
 
Das würde erstens den Sinn eines Arrays vergewaltigen und zweitens alles unnötig verkomplizieren & verlangsamen. Je mehr Ordner und Unterordner man ausgeben will, desto mehr Schleifen (array_search => Schleife) würden mit deiner Version entstehen. Damit würde die Laufzeit und der Ressourcenverbrauch exponentiell steigen. Drittens: Du nimmst die Größe als Index ... was ist wenn zweimal die selbe Größe auftritt? Autsch!

/Edit:
Keita hats bereits angesprochen ;)
 
Zurück
Oben