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

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(‚./‘);
?>[/PHP]Bin ich blöd oder warum klappt dieses einfach nicht:
[PHP]
sort($file);
[/PHP]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]
PHP: ArrayObject - Manual

Fatal error: Call to undefined method ArrayObject::sort() in

Hat an dieser Zeile was auszusetzen:
$iterator->sort();

asort() kennt es aber.

Dann kommt gar keine Ausgabe mehr. :-/

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";
}

}[/php]

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());‘));[/php]

@crash: Ja, es geht sicher eleganter. Das habe ich aber gerade nicht hinbekommen. :expressionless:

:frowning: 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.

Poste mal die Fehlermeldung.

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";
}

}[/php]

danke, jetzt gehts.
Ich hatte alles nur kopiert.