نتائج فقرات PHP: فرز حسب ملف المجلد ، ثم الأبجدية

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

بخلاف أ usort و is_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