Результаты PHP scandir: сортировка по папке-файлу, затем по алфавиту - PullRequest
4 голосов
/ 02 декабря 2010

Руководство по PHP для scandir : По умолчанию отсортированный порядок сортируется по алфавиту в порядке возрастания .

Я создаю файловый браузер (в Windows), поэтому хочу, чтобы возвращаемые адреса сортировались по папке / файлу, а затем в алфавитном порядке в этих подмножествах.

Пример. Прямо сейчас я сканирую и вывожу

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

и я хочу

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

Кроме решений usort и is_dir() (которые я сам могу выяснить), есть ли быстрый и эффективный способ сделать это?

Ниндзя, который написал этот комментарий на правильном пути - это лучший способ?

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

Это дает вам то, что вы хотите?

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.

2 голосов
/ 09 сентября 2012

Пожалуйста, попробуйте это. Простая функция для сортировки результатов PHP scandir по файлам и папкам (каталогам):

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;
}
0 голосов
/ 15 сентября 2011

Я опаздываю на вечеринку, но мне нравится предлагать свое решение с readdir(), а не с glob().Чего мне не хватало в решении, так это рекурсивной версии вашего решения.Но с readdir это быстрее, чем с glob.

Так что с 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, но имеет в основном тот же результат:1009 *

Надеюсь, кому-нибудь это пригодится.

...