2013-02-25 10 views
6
$dir = '/master/files'; 
$files = scandir($dir); 
foreach($files as $file){ 
    if(($file != '.') && ($file != '..')){ 
     if(is_dir($dir.'/'.$file)){ 
     echo '<li class="folder">'.$file.'</li>'; 
     }else{ 
     echo '<li class="file">'.$file.'</li>'; 
     } 
    } 
} 

स्क्रिप्ट से ऊपर, मैं परिणाम प्राप्त:पीएचपी: प्रकार पहले फ़ोल्डर और उसके बाद फाइल

images (folder) 
index.html  
javascript (folder) 
style.css 

कैसे पहले और उसके बाद फ़ाइलें फ़ोल्डर सॉर्ट करने के लिए?

+0

पहले उन्हें दो सरणी में सहेजें और फिर उन्हें प्रिंट करें (फ़ोल्डर पहले और फिर फ़ाइलें) :) –

+0

आपका मतलब है कि मुझे दो "foreach" बनाना है? फ़ोल्डर के लिए और फिर फ़ाइलों के लिए? – Ogy

उत्तर

6

इस प्रयास करें:

$dir = '/master/files'; 
$directories = array(); 
$files_list = array(); 
$files = scandir($dir); 
foreach($files as $file){ 
    if(($file != '.') && ($file != '..')){ 
     if(is_dir($dir.'/'.$file)){ 
     $directories[] = $file; 

     }else{ 
     $files_list[] = $file; 

     } 
    } 
} 

foreach($directories as $directory){ 
    echo '<li class="folder">'.$directory.'</li>'; 
} 
foreach($files_list as $file_list){ 
    echo '<li class="file">'.$file_list.'</li>'; 
} 
+2

का उपयोग करना होगा, मुझे लगता है कि दो foreach अच्छा नहीं है, सरणी बनाते समय ली को बचाएं, फिर प्रिंटिंग के लिए इंपोड का उपयोग करना बेहतर है –

+0

धन्यवाद, इसका काम बढ़िया है! :) – Ogy

3

आप 2 छोरों बनाने के लिए, आप कोड के इस टुकड़े के साथ काम कर सकते हैं की जरूरत नहीं है:

<?php 

function scandirSorted($path) { 

    $sortedData = array(); 
    foreach(scandir($path) as $file) { 

     // Skip the . and .. folder 
     if($file == '.' || $file == '..') 
      continue;    

     if(is_file($path . $file)) { 
      // Add entry at the end of the array 
      array_push($sortedData, '<li class="folder">' . $file . '</li>'); 
     } else { 
      // Add entry at the begin of the array 
      array_unshift($sortedData, '<li class="file">' . $file . '</li>'); 
     } 
    } 
    return $sortedData; 
} 

?> 

यह समारोह अपने पथ के एंट्री में वापस आ जाएगी, फ़ाइलें फ़ोल्डर पहले, तो। बल्कि कई गुजरता की आवश्यकता होती है की तुलना में एक बार सब कुछ के माध्यम से

$folder_list = ""; 
$file_list = ""; 
$dir = '/master/files'; 
$files = scandir($dir); 
foreach($files as $file){ 
    if(($file != '.') && ($file != '..')){ 
     if(is_dir($dir.'/'.$file)){ 
     $folder_list .= '<li class="folder">'.$file.'</li>'; 
     }else{ 
     $file_list .= '<li class="file">'.$file.'</li>'; 
     } 
    } 
} 

print $folder_list; 
print $file_list; 

यह केवल छोरों,:

+0

लूप में स्टाइल अच्छा विचार है, लेकिन यह फ़ोल्डर या फ़ाइलों को 'ए-जेड' क्रमबद्ध नहीं करेगा। –

+0

वास्तव में, यदि आदेश महत्वपूर्ण है, तो आपको 2 एरे – MatRt

3

अपने कोड के रूप में संभव के रूप में थोड़ा संशोधन करना।

1

आउटपुट को 2 सरणी में स्टोर करें, फिर सही क्रम में आउटपुट करने के लिए सरणी के माध्यम से पुनरावृत्त करें।

$dir = '/master/files'; 

$contents = scandir($dir); 

// create blank arrays to store folders and files 
$folders = $files = array(); 

foreach ($contents as $file) { 

    if (($file != '.') && ($file != '..')) { 

     if (is_dir($dir.'/'.$file)) { 

      // add to folders array 
      $folders[] = $file; 

     } else { 

      // add to files array 
      $files[] = $file; 

     } 
    } 
} 

// output folders 
foreach ($folders as $folder) { 

    echo '<li class="folder">' . $folder . '</li>'; 

} 

// output files 
foreach ($files as $file) { 

    echo '<li class="file">' . $file . '</li>'; 

} 
0

प्रयास करें

<?php 
    $path = $_SERVER['DOCUMENT_ROOT']; 
    chdir ($path); 

    $dir = array_diff (scandir ('.'), array ('.', '..', '.DS_Store', 'Thumbs.db')); 

    usort ($dir, create_function ('$a,$b', ' 
     return is_dir ($a) 
     ? (is_dir ($b) ? strnatcasecmp ($a, $b) : -1) 
     : (is_dir ($b) ? 1 : (
      strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION)) == 0 
      ? strnatcasecmp ($a, $b) 
      : strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION)) 
     )) 
    ; 
')); 

    header ('content-type: text/plain'); 
    print_r ($dir); 
?> 
1

मैं एन गहरी पुनरावर्ती निर्देशिका स्कैन के लिए एक समाधान है:

function scanRecursively($dir = "/") { 
    $scan = array_diff(scandir($dir), array('.', '..'); 
    $tree = array(); 
    $queue = array(); 
    foreach ($scan as $item) 
     if (is_file($item)) $queue[] = $item; 
     else $tree[] = scanRecursively($dir . '/' . $item); 
    return array_merge($tree, $queue); 
} 
0

एक CodeIgniter प्रेमी होने के नाते, मैं वास्तव में कोर संशोधित है directory_helper कि से गहराई को स्थापित करने और छुपा फाइलों को चुनने के अलावा चुनने के अलावा कुछ फ़ाइलों को स्कैनिंग से मुक्त करने की क्षमता शामिल करने के लिए।

सभी क्रेडिट सीआई के मूल लेखकों के पास जाता है। मैंने इसे में सॉर्टिंग सरणी और सॉर्टिंग में बिल्डिंग के साथ जोड़ा।

यह फ़ोल्डर को ऑर्डर करने के लिए ksort का उपयोग करता है, क्योंकि प्रत्येक फ़ोल्डर के अंदर फ़ाइलों को ऑर्डर करने के लिए फ़ोल्डर नाम कुंजी और natsort के रूप में सेट किया जाता है।

केवल एक चीज जो आपको करने की आवश्यकता हो सकती है, यह परिभाषित करता है कि DIRECTORY_SEPARATOR आपके पर्यावरण के लिए क्या है लेकिन मुझे नहीं लगता कि आपको और भी संशोधित करने की आवश्यकता होगी।

function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE, $exempt = array()) 
{ 
    if ($fp = @opendir($source_dir)) 
    { 
     $folddata = array(); 
     $filedata = array(); 
     $new_depth = $directory_depth - 1; 
     $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; 

     while (FALSE !== ($file = readdir($fp))) 
     { 
      // Remove '.', '..', and hidden files [optional] 
      if ($file === '.' OR $file === '..' OR ($hidden === FALSE && $file[0] === '.')) 
      { 
       continue; 
      } 

      is_dir($source_dir.$file) && $file .= DIRECTORY_SEPARATOR; 

      if (($directory_depth < 1 OR $new_depth > 0) && is_dir($source_dir.$file)) 
      { 
       $folddata[$file] = directory_map($source_dir.$file, $new_depth, $hidden, $exempt); 

      } 
      elseif(empty($exempt) || !empty($exempt) && !in_array($file, $exempt)) 
      { 
       $filedata[] = $file; 
      } 
     } 

     !empty($folddata) ? ksort($folddata) : false; 
     !empty($filedata) ? natsort($filedata) : false; 

     closedir($fp); 
     return array_merge($folddata, $filedata); 
    } 

    return FALSE; 
} 

प्रयोग उदाहरण होगा:

$filelist = directory_map('full_server_path'); 

ऊपर उल्लेख किया है, यह बच्चे सरणी के लिए कुंजी के रूप में फ़ोल्डर नाम सेट हो जाएगा, तो आप निम्नलिखित की तर्ज पर कुछ उम्मीद कर सकते हैं:

Array(
[documents/] => Array(
    [0] => 'document_a.pdf', 
    [1] => 'document_b.pdf'  
    ), 
[images/] => Array(
    [tn/] = Array(
     [0] => 'picture_a.jpg', 
     [1] => 'picture_b.jpg' 
     ), 
    [0] => 'picture_a.jpg', 
    [1] => 'picture_b.jpg'   
    ), 
[0] => 'file_a.jpg', 
[1] => 'file_b.jpg' 
); 

बस ध्यान रखें कि छूट सभी फ़ोल्डर्स पर लागू की जाएगी। यह आसान है अगर आप index.html फ़ाइल या अन्य फ़ाइल को छोड़ना चाहते हैं जो उन निर्देशिकाओं में उपयोग किया जाता है जिन्हें आप शामिल नहीं करना चाहते हैं।

संबंधित मुद्दे