نتائج فقرات PHP: فرز حسب ملف المجلد ، ثم الأبجدية
سؤال
دليل 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);
}
}
آمل أن يجد شخص ما هذا مفيدًا.