2013-02-25 33 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>'; 
     } 
    } 
} 

Từ kịch bản trên, tôi nhận được kết quả:PHP: sắp xếp thư mục đầu tiên và sau đó tập tin

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

Làm thế nào để sắp xếp các thư mục đầu tiên và sau đó tập tin này?

+0

trước tiên lưu chúng trong hai mảng và sau đó in chúng (thư mục đầu tiên và sau đó tệp) :) –

+0

Bạn có nghĩa là tôi phải thực hiện hai "foreach"? Một cho thư mục và sau đó cho các tập tin? – Ogy

Trả lời

6

Hãy thử điều này:

$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

Tôi nghĩ rằng hai foreach không tốt, tiết kiệm li khi tạo mảng, sau đó sử dụng implode để in tốt hơn –

+0

Cảm ơn, công việc của nó tuyệt vời! :) – Ogy

3

Bạn không cần phải thực hiện 2 vòng, bạn có thể thực hiện công việc với đoạn mã này:

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

?> 

Chức năng này sẽ trở lại danh sách các mục của đường dẫn của bạn, thư mục đầu tiên, sau đó tập tin.

+0

kiểu dáng trong vòng lặp là ý tưởng hay, nhưng điều này sẽ không sắp xếp các thư mục hoặc tệp 'a-z'. –

+0

Thật vậy, nếu thứ tự quan trọng, thì bạn phải sử dụng 2 mảng – MatRt

3

Sửa đổi mã của bạn càng ít càng tốt:

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

chỉ này vòng qua tất cả mọi thứ cùng một lúc, chứ không phải là đòi hỏi nhiều đèo.

1

Lưu đầu ra trong 2 mảng, sau đó lặp qua các mảng để xuất chúng theo đúng thứ tự.

$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

Hãy thử

<?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

tôi có một giải pháp cho N sâu đệ quy thư mục quét:

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

Là một người yêu CodeIgniter, tôi có trong thực tế biến đổi cốt lõi directory_helper từ đó để bao gồm khả năng có một số tệp nhất định được miễn khỏi quá trình quét ngoài việc đặt độ sâu và chọn có bao gồm các tệp ẩn hay không.

Tất cả tín dụng được chuyển đến tác giả gốc của CI. Tôi chỉ cần thêm vào nó với mảng được miễn và xây dựng trong sắp xếp.

Nó sử dụng ksort để đặt hàng các thư mục, vì tên thư mục được đặt làm khóa và đặt tên tệp để sắp xếp các tệp trong mỗi thư mục.

Điều duy nhất bạn có thể cần làm là xác định DIRECTORY_SEPARATOR là gì cho môi trường của bạn nhưng tôi không nghĩ bạn sẽ cần sửa đổi nhiều thứ khác.

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

dụ Cách sử dụng sẽ là:

$filelist = directory_map('full_server_path'); 

Như đã đề cập ở trên, nó sẽ thiết lập tên thư mục như là chìa khóa cho mảng con, vì vậy bạn có thể mong đợi một cái gì đó dọc theo dòng trong các cách sau:

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

Chỉ cần nhớ rằng việc miễn trừ sẽ được áp dụng cho tất cả các thư mục. Điều này rất tiện lợi nếu bạn muốn bỏ qua tệp index.html hoặc tệp khác được sử dụng trong các thư mục bạn không muốn đưa vào.

Các vấn đề liên quan