2010-11-17 44 views
5

Tôi đang cố gắng để có được một danh sách với thư mục và thư mục con tôi có những điều sau đây cho phép tôi để có được các thư mục và thư mục phụ nhưng tôi cần nó được sắp xếp như ví dụ như dưới đây tôi đã cố gắng nhưng tôi không biết làm thế nào tôi sẽ có được xung quanh.Làm thế nào để hiển thị các thư mục và thư mục con từ thư mục trong PHP

Root/ 
Root/Images 
Root/Images/UserImages 

Root/Text/ 
Root/Text/User1/ 
Root/Text/User1/Folder2 

nhưng đồng monent hiển thị của nó như

Root/css/ 
tree/css/ 
js/ 
images/ 

PHP này Mã sản phẩm:

function ListFolder($path) 
{ 

    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    //Leave only the lastest folder name 
    $dirname = end(explode("/", $path)); 

    //display the target folder. 
    echo ("$dirname/"); 
    while (false !== ($file = readdir($dir_handle))) 
    { 
     if($file!="." && $file!="..") 
     { 
      if (is_dir($path."/".$file)) 
      { 
       //Display a list of sub folders. 
       ListFolder($path."/".$file); 
       echo "<br>"; 
      } 
     } 
    } 


    //closing the directory 
    closedir($dir_handle); 
} 

    ListFolder("../"); 

Cảm ơn bạn

+1

thể trùng lặp tối thiểu là [PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator lấy cây đầy đủ] (http: //stackoverflow.com/questions/2418068/php-spl-recursivedirectoryiterator-recursiveiteratoriterator-retrieving-the-full) – Gordon

Trả lời

3

Thu thập các tên thư mục trong một mảng thay vì echo ing chúng trực tiếp. Sử dụng sort trên mảng và foreach vòng để in danh sách.

Vì vậy, thay vì echo ("$dirname/");, bạn sẽ sử dụng $dirnames[] = $dirname; (tạo $ dirnames toàn cục và khởi chạy trước cuộc gọi đầu tiên của "ListFolder"). Sau đó, sau khi chạy đệ quy của "ListFolder", bạn muốn thực hiện sort($dirnames); và sau đó một cái gì đó như thế này cho kết quả:

foreach ($dirnames as $dirname) 
{ 
    echo $dirname . '<br />'; 
} 
1

bạn có thể đạt được những gì bạn muốn với DirectoryIterator hoặc tốt hơn các RecursiveDirectoryIterator từ SPL php.

đây là một ví dụ nhanh về cách sử dụng này:

$dir = '/path/to/directory'; 
    $result = array(); 

    if (is_dir($dir)) { 
      $iterator = new RecursiveDirectoryIterator($dir); 
      foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) {      
       if (!$file->isFile()) { 
        $result[] = 'path: ' . $file->getPath(). ', filename: ' . $file->getFilename(); 
       } 
      } 

    } 

này nên làm các trick. Chúc may mắn;)

+0

Nó sẽ (có lẽ) là thích hợp hơn để bỏ qua 'is_dir()' và nắm bắt 'UnexpectedValueException' được ném bởi' RecursiveDirectoryIterator' nếu '$ dir' không phải là một thư mục; sau này sẽ kiểm tra thư mục. Bạn cũng có thể quấn các trình vòng lặp trong một 'ParentIterator', chỉ liệt kê các thư mục và từ bỏ điều kiện' isFile() '. – salathe

+0

vâng, bạn nói đúng, tôi có thể và nên làm điều đó, nhưng ở đây tôi chỉ đang cố gắng cho anh ta xem một ví dụ nhanh. cảm ơn! – misterjinx

1

với mã này, bạn sẽ nhận được danh sách với các thư mục con (nhưng thiết lập tên thư mục của bạn)

<?php 
$path = realpath('yourfolder/examplefolder'); 
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) 
{ 
     echo "$filename\n"; 
} 
?> 
Các vấn đề liên quan