PHP Neue Dateien gesondert auflisten

romacasa

Mitglied
Hier der Code vor allen Tags:

Code:
<?php

$ordner = 'audios';
$ausgabe = array();

$inhverz = file("inh.txt");
sort($inhverz, SORT_NATURAL);

$audio = scandir($ordner);
$audio = array_diff($audio, array('..', '.', '.DS_Store', '._.DS_Store', '@eaDir'));

$audionew = array();

foreach ($audio as $naudio) {
    $audios = substr($naudio, 0, -4);
    $audionew[] = $audios;
}

// Sammle Informationen zu den neuesten Dateien
$neueDateien = array();

foreach ($audio as $naudio) {
    $dateiPfad = $ordner . '/' . $naudio;
    $timestamp = filemtime($dateiPfad);
    $dreiMonateAgo = strtotime('-10 months');

    if ($timestamp >= $dreiMonateAgo) {
        $neueDateien[basename($dateiPfad)] = $timestamp;
    }
}

// Sortiere die neuesten Dateien nach dem Änderungsdatum absteigend
arsort($neueDateien);



// Abgleich inh.txt mit Ordner und Inhaltsverzeichnis
if (!empty($audio) && !empty($inhverz)) {
    foreach ($inhverz as $eintrag) {
        $buchstabe = substr($eintrag, 0, 1);
        foreach ($audionew as $dateinummer) {
            if (strpos($eintrag, $dateinummer)) {
                $ausgabe[$buchstabe][$dateinummer] = $eintrag;
            }
        }
    }
} else {
    echo "Die Audiodateien und/oder das Inhaltsverzeichnis scheinen nicht vorhanden zu sein!";
}

?>

Und dies hier steht im Body Tag:

Code:
<?PHP
// Ausgabe der neuesten Dateien
echo '<h2>Neu hinzugefügt:</h2>';

foreach ($neueDateien as $dateiname => $timestamp) {
    echo "<a href='player.php?file=" . urlencode(substr($dateiname, 0, -4)) . "'>" . $dateiname . "</a> (Hinzugefügt am: " . date('d.m.Y', $timestamp) . ")";
}

// Ausgabe des Inhaltsverzeichnisses auf der Webseite
foreach ($ausgabe as $key => $liste) {
    echo '<h2>' . $key . '</h2>';
    foreach ($liste as $key2 => $ausgabeliste) {
        echo "<a href='player.php?file=" . urlencode($key2) . "'>" . basename($ausgabeliste) . "</a>";
    }
}
?>

Dies führt zu folgendem Ergebnis: Testseite

Und irgendwie stehe ich auf dem Schlauch. Statt der Dateinummer möchte ich den Teil des Inhaltsverzeichnisses hier stehen haben, wie es unter A zu sehen ist.
Welchen Denkfehler oder was habe ich übersehen?
 
Wenn ich das richtig verstehe, möchtest Du die neuen Dateien in dem selben Format anzeigen wie die vollständige Liste, d. h. als Verweis auf die player-PHP mit der Dateinummer als URL-Parameter.
In dem Fall würde ich das Array mit den neuen Dateien ebenfalls in der verschachtelten Schleife anlegen, denn Du brauchst ja die selben Parameter. Dabei den Zeitstempel hinzu fügen und am Schluss danach sortieren:
Code:
$ordner = 'audios';
$ausgabe = array();

$inhverz = file("inh.txt");
sort($inhverz, SORT_NATURAL);

$audios = scandir($ordner);
$audios = array_diff($audios, array('..', '.', '.DS_Store', '._.DS_Store', '@eaDir'));

// $audionew = array();

// foreach ($audio as $naudio) {
//     $audios = substr($naudio, 0, -4);
//     $audionew[] = $audios;
// }

// Sammle Informationen zu den neuesten Dateien
// $neueDateien = array();

// foreach ($audio as $naudio) {
//     $dateiPfad = $ordner . '/' . $naudio;
//     $timestamp = filemtime($dateiPfad);
//     $dreiMonateAgo = strtotime('-10 months');

//     if ($timestamp >= $dreiMonateAgo) {
//         $neueDateien[basename($dateiPfad)] = $timestamp;
//     }
// }

// // Sortiere die neuesten Dateien nach dem Änderungsdatum absteigend
// arsort($neueDateien);


$ausgabe = [];
$ausgabeNeu = [];
$dreiMonateAgo = strtotime('-10 months');
// Abgleich inh.txt mit Ordner und Inhaltsverzeichnis
if (!empty($audios) && !empty($inhverz)) {
    foreach ($inhverz as $eintrag) {
        $buchstabe = substr($eintrag, 0, 1);
        foreach ($audios as $audio) {
            $dateinummer = substr($audio, 0, -4);
            if (strpos($eintrag, $dateinummer)) {
                // 1. für die vollständige Ausgabe aller Audiodateien:
                $ausgabe[$buchstabe][$dateinummer] = $eintrag;
                // 2. für die Ausgabe der neuen Dateien:
                $dateiPfad = $ordner . '/' . $audio;
                $timestamp = filemtime($dateiPfad);
                if ($timestamp >= $dreiMonateAgo) {
                    $ausgabeNeu[] = [
                        'timestamp' => $timestamp,
                        'dateinummer' => $dateinummer,
                        'eintrag' => $eintrag
                    ];
                }
            }
        }
    }

    // Array für die Ausgabe der neuen Dateien nach Zeitstempel sortieren:
    usort($ausgabeNeu, function($a, $b){
        if ($a['timestamp'] == $b['timestamp']) {
            return 0;
        }
        return ($a['timestamp'] < $b['timestamp']) ? -1 : 1;
    });
} else {
    echo "Die Audiodateien und/oder das Inhaltsverzeichnis scheinen nicht vorhanden zu sein!";
}
Die Ausgabe im Body kannst Du dann sicher selber umändern.
Ungetestet, da mit die Dateien nicht zur Verfügung standen.
Edit: Bei der Callback-Funktion habe ich mich nach dem Beispiel in der Doku gerichtet. Nach der Beschreibung dort müsste aber auch eine stark vereinfachte Version möglich sein:
Code:
    // Array für die Ausgabe der neuen Dateien nach Zeitstempel sortieren:
    usort($ausgabeNeu, function($a, $b){
        return ($a['timestamp'] - $b['timestamp']);
    });
 
Zuletzt bearbeitet:
Herzlichen Dank. Folgendes habe ich getan:

PHP:
// Abgleich inh.txt mit Ordner und Inhaltsverzeichnis
if (!empty($audios) && !empty($inhverz)) {
    foreach ($inhverz as $eintrag) {
        $buchstabe = substr($eintrag, 0, 1);
        foreach ($audios as $audio) {
            $dateinummer = substr($audio, 0, -4);
            if (strpos($eintrag, $dateinummer)) {
                // 1. für die vollständige Ausgabe aller Audiodateien:
                $ausgabe[$buchstabe][$dateinummer] = $eintrag;
                // 2. für die Ausgabe der neuen Dateien:
                $dateiPfad = $ordner . '/' . $audio;
                $timestamp = filemtime($dateiPfad);
                if ($timestamp >= $dreiMonateAgo) {
                  
// 2 Elemente entfernt ------->

   $ausgabeNeu[] = [
                     'eintrag' => $eintrag
                    ];
                }
            }
        }
    }

    // Array für die Ausgabe der neuen Dateien nach Zeitstempel sortieren:
    usort($ausgabeNeu, function($a, $b){
        if ($a['timestamp'] == $b['timestamp']) {
            return 0;
        }
        return ($a['timestamp'] < $b['timestamp']) ? -1 : 1;
    });
} else {
    echo "Die Audiodateien und/oder das Inhaltsverzeichnis scheinen nicht vorhanden zu sein!";
}

Denn die Ausgabe genügt, wenn nur der Titel ist. Schön wäre es, wenn noch das Datum des Hhochladens angezeigt wird.

Und folgendes ist im Body:
PHP:
<?PHP
// Ausgabe der neuesten Dateien
echo '<h2>Neu hinzugefügt:</h2>';
foreach ($ausgabeNeu as $key => $liste) {
    foreach ($liste as $key2 => $ausgabeliste) {
        echo "<a href='player.php?file=" . urlencode($key2) . "'>" . basename($ausgabeliste) . "</a>  ";
    }
}

// Ausgabe des Inhaltsverzeichnisses auf der Webseite
foreach ($ausgabe as $key => $liste) {
    echo '<h2>' . $key . '</h2>';
    foreach ($liste as $key2 => $ausgabeliste) {
        echo "<a href='player.php?file=" . urlencode($key2) . "'>" . basename($ausgabeliste) . "</a>";
    }
}
?>

Es geht die Sortierung nicht so, wie gewollt. Denn es müssten die 007 (die Jüngste Datei), dann die 006er und zum Schluss die 005 aufgelistet sein. Die 005 ist die älteste.

Was habe ich übersehen?
 
Zuletzt bearbeitet:
Auf jeden Fall passt das PHP im Body nicht mit dem vom Anfang zusammen.
Schreib doch erst Mal, ob diese Annahme von mir zutrifft:
Wenn ich das richtig verstehe, möchtest Du die neuen Dateien in dem selben Format anzeigen wie die vollständige Liste, d. h. als Verweis auf die player-PHP mit der Dateinummer als URL-Parameter.
 
Ja, die Anzeige soll so sein, wie in der alphabetischen Ordnung eingetragen - mit dem Dateinamen als URL-Parameter für die Übergabe an den Player (also z.B. 007_01 ) . Es soll ohne Alphabet angezeigt werden, sondern in der Sortierung von Neuestem zum Ältesten. Dein Code funktioniert soweit - auch mit den 2 zusätzlichen Elemente. Diese werden jedoch mit ausgegeben, was nicht erwünscht ist. Daher dachte ich, dass ich es dort löschen muss.....

PS: Habe gerade festgestellt, dass der Dateiname (007_01) in der Rubrik "Neu Hinzugefügt" nicht übergeben wird....

Gruss Romano
 
Dein Code funktioniert soweit - auch mit den 2 zusätzlichen Elemente. Diese werden jedoch mit ausgegeben, was nicht erwünscht ist.
Dann versuche es Mal mit meinem ursprünglichen Code und diesem im Body:
Code:
foreach ($ausgabeNeu as $item) {
    echo "<a href='player.php?file=" . urlencode($item['dateinummer']) . "'>" . $item['eintrag'] . "</a> (Hinzugefügt am: " . date('d.m.Y', $item['timestamp']) . ")";
}

Mir scheint, assoziative Arrays in PHP sind noch Neuland für dich? Hier wird es ein wenig erklärt:
Arrays – PHP lernen
 
Zuletzt bearbeitet:
@Sempervivum Herzlichen Dank, funktioniert soweit, bis auf die Sortierung, die noch umgedreht werden sollte.... Vieles ist noch Neuland und nicht durchwegs verständlich. Danke für den Link. Ich habe es gelesen, jedoch noch nicht ganz durchschaut. Ebenso weiss ich nicht, was
PHP:
$dateiPfad = $ordner . '/' . $audio;
dies bewirkt
und wie man die Funktion anspricht, die Du notiert hast:
PHP:
usort($ausgabeNeu, function($a, $b){
        if ($a['timestamp'] == $b['timestamp']) {
            return 0;
        }
        return ($a['timestamp'] < $b['timestamp']) ? -1 : 1;
    })

Aber es macht dennoch Freude, wenn man sich da durchgerungen hat und sieht, dass es funktioniert. Dank der Wertvollen Hilfe Deinerseits.

Mit freundlichen Grüßen
Romano

Teestseite
 
Code:
$dateiPfad = $ordner . '/' . $audio;
Mit dem Punkt kann man Strings verketten bzw. zusammen fügen. Dein $ordner ist ja 'audios' und das $audio z. b. '326_03'. Dann ergibt sich für die Variable $dateiPfad 'audios/326_03'.

wie man die Funktion anspricht, die Du notiert hast:
PHP:
usort($ausgabeNeu, function($a, $b){
if ($a['timestamp'] == $b['timestamp']) {
return 0;
}
return ($a['timestamp'] < $b['timestamp']) ? -1 : 1;
})
Diese Funktion ist nicht dazu gedacht, dass man sie selbst anspricht oder aufruft sondern sie wird automatisch von der Funktion usort aufgerufen beim Sortieren. Die Parameter $a und $b werden ebenfalls automatisch von usort übergeben und enthalten die beiden Datensätze aus dem Array das zu sortieren ist. Weiteres kannst Du hier in der Doku nachlesen:
PHP: usort - Manual
Um die Reihenfolge des Sortierens umzukehren brauchst Du nur das < in ein > umzuändern:

Code:
usort($ausgabeNeu, function($a, $b){
    if ($a['timestamp'] == $b['timestamp']) {
        return 0;
    }
    return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
})
 
Super. Nochmals Danke für die Infos. Habe die Ausgabe in eine Schleife gesetzt. die jetzt nur eine Ausgabe setzt, wenn das Array "$ausgabeNeu" nicht leer ist. Und es funktioniert so. Vielen lieben dank. und ein frohes neues Jahr.
Mit freundlichen Grüßen
Romano
 

Neue Beiträge

Zurück