2011-04-07 94 views
1

我編寫了以下PHP代碼來顯示目錄中的文件。它使用JQuery擴展文件夾。一切工作正常,但現在它顯示按字母順序混合文件類型的所有文件。PHP按類型對目錄中的文件進行排序

我想保留字母順序,但分開顯示文件夾和文件。如何對顯示的文件進行排序,以便文件夾顯示在上方,其他文件顯示在下方。

換句話說,如何按文件類型對文件進行排序?

非常感謝!

<?php 
$path = ROOT_PATH; 
$dir_handle = @opendir($path) or die("Unable to open $path"); 
list_dir($dir_handle,$path); 

function list_dir($dir_handle,$path) 
{ 
    echo "<ul class='treeview'>"; 

    while (false !== ($file = readdir($dir_handle))) 
    { 
     $dir =$path.'/'.$file; 
     if(is_dir($dir) && $file != '.' && $file !='..') 
     { 
      $handle = @opendir($dir) or die("undable to open file $file"); 
      echo '<li class="folder"><a href="#" class="toggle">'.$file.'</a></li>'; 
      list_dir($handle, $dir); 
     } 
     elseif($file != '.' && $file !='..') 
     { 
      echo '<li class="file"><a href="file-details.php?file='.$dir.'" class="arrow_icon modal">'.$file.'</a></li>'; 
     } 
    } 

    echo "</ul>"; 

    closedir($dir_handle); 
} 
?> 

回答

2

你應該做的第一件事是分開的獲取/整理文件,並顯示它們的邏輯,也許會讓定製更容易..

這裏是一個有效的解決方案(今天早上有一些空閒時間: )

list_dir(ROOT_PATH); 

/* Rendering */ 
function list_dir($path) 
{ 
    $items = get_sorted_entries($path); 

    if (!$items) 
     return; 

    echo "<ul class='treeview'>"; 


    foreach($items as $item) 
    { 
     if ($item->type=='dir') 
     { 
      echo '<li class="folder"><a href="#" class="toggle">'.$item->entry.'</a></li>'; 
      list_dir($item->full_path); 
     } 
     else 
     { 
      echo '<li class="file"><a href="file-details.php?file='.urlencode($item->full_path).'" class="arrow_icon modal">'.$item->entry.'</a></li>'; 
     } 
    } 

    echo "</ul>"; 

} 

/* Finding */ 
function get_sorted_entries($path) 
{ 
    $dir_handle = @opendir($path) ; 
    $items = array(); 

    while (false !== ($item = readdir($dir_handle))) 
    { 
     $dir =$path.'/'.$item; 
     if ($item == '.' || $item =='..') 
      continue; 

     if(is_dir($dir)) 
     { 
      $items[] = (object) array('type'=>'dir','entry'=>$item, 'full_path'=>$dir); 
     } 
     else 
     { 
      $items[] = (object) array('type'=>'file','entry'=>$item, 'full_path'=>$dir); 
     } 
    } 
    closedir($dir_handle); 

    usort($items,'_sort_entries'); 

    return $items; 
} 

/* Sorting */ 
function _sort_entries($a, $b) 
{ 
    return strcmp($a->entry,$b->entry); 
} 

編輯:如果你想先顯示目錄,更改排序功能,這一點:

function _sort_entries($a, $b) 
{ 
    if ($a->type!=$b->type) 
     return strcmp($a->type,$b->type); 

    return strcmp($a->entry,$b->entry); 
} 

這將把目錄放在頂部(Windows風格)

+0

你搖滾的男人!非常感謝! – usnidorg 2011-04-08 00:08:03

+0

@usidorg。沒有問題。編輯我的帖子,在頂部 – Ben 2011-04-08 00:09:51

+0

的目錄略有變化謝謝!這正是我想要做的。 – usnidorg 2011-04-08 00:13:54

相關問題