• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

localhost richtig sortiert, auf Server nicht. sort() einbauen

aJunkie

Mitglied
Hallo,

ich hatte 'en kleinen Script geschrieben, aber dann doch verworfen, als ich einen alten Thread von mir entdeckte, wo ein netter User (Danke mermshaus) diesen hier gepostet hatte:
PHP:
<?php
class FileExtensionFilterIterator extends FilterIterator
{
    protected $whitelist;

    public function __construct(Iterator $iterator, array $whitelist)
    {
        parent::__construct($iterator);
        $this->whitelist = $whitelist;
    }

    public function accept()
    {
        $fileInfo = parent::current();

        // Nur Dateien
        if (!$fileInfo->isFile()) {
            return false;
        }

        // Nur mit Endung aus $whitelist
        $pi = pathinfo($fileInfo->getFilename());
        if (!in_array(strtolower($pi['extension']), $this->whitelist)) {
            return false;
        }

        return true;
    }
}

function listfiles($path)
{
    $whitelist = array('rar'); // Aufzulistende Dateiendungen

    $iterator = new FileExtensionFilterIterator(
                    new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator($path)),
                    $whitelist);

    foreach ($iterator as $file) {
        $size = filesize($file);
            // unter anderem auch hier setzte ich sort ein.
        $size = $size/1024/1024;
        $size = round($size,2);
        echo '<a href="' . $file . '">' . basename($file) . '</a> ' . $size . ' MB<br>' . "\n";
    }
}

listFiles('./');
?>
Bin ich blöd oder warum klappt dieses einfach nicht:
PHP:
sort($file);
Es kommt eine Fehlermeldung:
Warning: sort() expects parameter 1 to be array, object given in C:\xampp\htdocs\uploads\index.php on line 63
 
Wenn wir schon bei dem ganzen SPL-Kram sind, würde ich gleich ArrayObjekt benutzen. Folgendes müsste klappen:
PHP:
$iterator = new ArrayObject(new FileExtensionFilterIterator(
                    new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator($path)),
                    $whitelist));
$iterator->sort();
PHP: ArrayObject - Manual
 
Fatal error: Call to undefined method ArrayObject::sort() in

Hat an dieser Zeile was auszusetzen:
$iterator->sort();
 
Zuletzt bearbeitet:
So vielleicht:

PHP:
function listfiles($path)
{
    $whitelist = array('pdf'); // Aufzulistende Dateiendungen

    $iterator = new FileExtensionFilterIterator(
                    new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator($path)),
                    $whitelist);

    foreach ($iterator as $file) {
        $files[] = $file;
    }
    
    usort($files, function (SplFileInfo $a, SplFileInfo $b) {
        return strcasecmp($a->getFilename(), $b->getFilename());
    });

    foreach ($files as $file) {
        $size = filesize($file);
        $size = $size/1024/1024;
        $size = round($size,2);
        echo '<a href="' . $file . '">' . basename($file) . '</a> ' . $size . ' MB<br>' . "\n";
    }
}

Wenn du kein PHP 5.3 hast, ersetze die usort-Zeile hierdurch:

PHP:
    usort($files, create_function('SplFileInfo $a, SplFileInfo $b',
        'return strcasecmp($a->getFilename(), $b->getFilename());'));

@crash: Ja, es geht sicher eleganter. Das habe ich aber gerade nicht hinbekommen. :|
 
:-( localhost funktioniert deine Variante, weil da 5.3 drauf ist.
Auf dem Server allerdings nicht, weil da 5.2 drauf ist.
Wenn ich die usort Zeile ersetze, sagt der mir, dass usort in einem Array sein soll.
 
Warning: usort() [function.usort]: The argument should be an array in /var/www/web0/html/uploads/index.php on line 64

Warning: Invalid argument supplied for foreach() in /var/www/web0/html/uploads/index.php on line 66
 
Okay, ich hatte vergessen, das Array zu initialisieren (siehe unten, $files = array();), was zu einem Fehler führt, wenn keine passenden Dateien gefunden werden. Der Fehler müsste aber auch bei der PHP5.3-Variante auftreten. Sicher, dass du dich nicht irgendwo vertippt hast?

PHP:
function listfiles($path)
{
    $whitelist = array('pdf'); // Aufzulistende Dateiendungen

    $iterator = new FileExtensionFilterIterator(
                    new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator($path)),
                    $whitelist);

    $files = array();

    foreach ($iterator as $file) {
        $files[] = $file;
    }

    usort($files, create_function('SplFileInfo $a, SplFileInfo $b',
        'return strcasecmp($a->getFilename(), $b->getFilename());'));

    foreach ($files as $file) {
        $size = filesize($file);
        $size = $size/1024/1024;
        $size = round($size,2);
        echo '<a href="' . $file . '">' . basename($file) . '</a> ' . $size . ' MB<br>' . "\n";
    }
}
 
Zurück
Oben