PHP Scandirの結果:フォルダーファイルでソートしてから、アルファベット順に並べ替えます

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

  •  30-09-2019
  •  | 
  •  

質問

PHPマニュアルのマニュアル スカンダル: デフォルトでは、並べ替えられた順序は昇順でアルファベット順です.

ファイルブラウザ(Windows)を構築しているため、アドレスをフォルダー/ファイルでソートし、その後、それらのサブセットでアルファベット順に戻したいと思います。

例:今、私はスキャンして出力します

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

そして、私は欲しいです

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

A以外 usortis_dir() 解決 (私は自分自身を理解することができます)、これを行うための迅速で効率的な方法はありますか?

書いた忍者 このコメント 正しい軌道に乗っていますか?それは最良の方法ですか?

役に立ちましたか?

解決

これはあなたにあなたが望むものを与えますか?

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

できないことに注意してください glob('*.*') ファイルは、名前が付けられたフォルダーをピックアップするためです like.this.

他のヒント

これを試してみてください。 PHPをソートするための単純な関数 スカンダル ファイルとフォルダーによる結果(ディレクトリ):

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

私はパーティーに遅れていますが、私は自分の解決策を提供するのが好きです readdir() ではなく glob(). 。私がソリューションに欠けていたのは、あなたのソリューションの再帰バージョンです。しかし、Readdirを使用すると、Globよりも速いです。

したがって、グローブでは次のようになります。

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

そして、これはReaddirにありますが、基本的に同じ出力があります。

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

}

誰かがこれが便利だと思うかもしれないことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top