Frage

PHP-Handbuch für scandir : standardmäßig die sortierten Reihenfolge ist aufsteigend alphabetisch .

Ich baue einen Dateibrowser (Windows), so dass ich die Adressen zurückgegeben werden soll nach Ordner / Datei sortiert werden, dann in alphabetischer Reihenfolge in diesen Untergruppen.

Beispiel: Gerade jetzt, ich scannen und Ausgang

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

, und ich will

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

Anders als eine usort und is_dir() Lösung (was ich selbst herausfinden kann), ist es eine schnelle und effiziente Möglichkeit, dies zu tun?

Der Ninja, schrieb dieser Kommentar auf der rechten Seite verfolgen - ist, dass der beste Weg,

War es hilfreich?

Lösung

Ist das geben, was Sie wollen?

function readDir($path) {

    // Make sure we have a trailing slash and asterix
    $path = rtrim($path, '/') . '/*';

    $dirs = glob($path, GLOB_ONLYDIR);

    $files = glob($path);

    return array_unique(array_merge($dirs, $files));

}

$path = '/path/to/dir/';

readDir($path);

Beachten Sie, dass Sie nicht für Dateien glob('*.*') kann, weil es Ordner mit dem Namen like.this aufgreift.

Andere Tipps

Bitte versuchen Sie dies.

: Eine einfache Funktion, um die PHP scandir Ergebnisse von Dateien und Ordnern (Verzeichnisse) zu sortieren
function sort_dir_files($dir)
{
        $sortedData = array();
        foreach(scandir($dir) as $file)
        {
                if(is_file($dir.'/'.$file))
                        array_push($sortedData, $file);
                else
                        array_unshift($sortedData, $file);
        }
        return $sortedData;
}

Ich bin spät zur Party, aber Ich mag meine Lösung mit readdir() bieten, anstatt mit glob(). Was ich aus der Lösung fehlt, ist eine rekursive Version Ihrer Lösung. Aber mit readdir es ist schneller als mit Glob.

So mit glob würde es so aussehen:

function myglobdir($path, $level = 0) {
    $dirs   = glob($path.'/*', GLOB_ONLYDIR);
    $files  = glob($path.'/*');
    $all2   = array_unique(array_merge($dirs, $files));
    $filter = array($path.'/Thumbs.db');
    $all    = array_diff($all2,$filter);

    foreach ($all as $target){
        echo "$target<br />";
        if(is_dir("$target")){
            myglobdir($target, ($level+1));
        }
    }
}

Und dies ist mit readdir aber hat grundsätzlich die gleiche Ausgabe:

function myreaddir($target, $level = 0){
    $ignore = array("cgi-bin", ".", "..", "Thumbs.db");
    $dirs = array();
    $files = array();

    if(is_dir($target)){
        if($dir = opendir($target)){
            while (($file = readdir($dir)) !== false){
                if(!in_array($file, $ignore)){
                    if(is_dir("$target/$file")){
                        array_push($dirs, "$target/$file");
                    }
                    else{
                        array_push($files, "$target/$file");
                    }

                }
            }

            //Sort
            sort($dirs);
            sort($files);
            $all = array_unique(array_merge($dirs, $files));

            foreach ($all as $value){
                echo "$value<br />";
                if(is_dir($value)){
                    myreaddir($value, ($level+1));
                }
            }
        }
        closedir($dir);
    }

}

ich hoffe, jemand dies nützlich finden könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top