Résultats PHP de scandir: trier par dossier fichier, puis par ordre alphabétique

StackOverflow https://stackoverflow.com/questions/4331853

  •  30-09-2019
  •  | 
  •  

Question

Manuel PHP scandir : Par défaut, l'ordre de tri est alphabétique dans l'ordre croissant .

Je construis un navigateur de fichiers (sous Windows), donc je veux que les adresses à être renvoyé triées par dossier / fichier, puis par ordre alphabétique dans ces sous-ensembles.

Exemple: En ce moment, je scanne et sortie

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

et je veux

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

autre qu'une solution de usort et is_dir() (que je peux comprendre moi-même), est-il un moyen rapide et efficace de le faire?

Le ninja qui a écrit ce commentaire est sur la droite suivre - est que la meilleure façon

Était-ce utile?

La solution

Est-ce que cela vous donne ce que vous voulez?

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);

Notez que vous ne pouvez pas glob('*.*') pour les fichiers, car il ramasse des dossiers nommés like.this.

Autres conseils

S'il vous plaît essayer. Une fonction simple pour trier PHP scandir résultats par les fichiers et dossiers (répertoires):

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

Je suis en retard à la fête mais je tiens à offrir ma solution avec readdir() plutôt qu'avec glob(). Ce que je manque de la solution est une version récursive de votre solution. Mais avec readdir il est plus rapide qu'avec glob.

Donc, avec glob il ressemblerait à ceci:

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

Et celui-ci est avec readdir mais a essentiellement la même sortie:

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

}

J'espère que quelqu'un pourrait trouver cela utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top