PHP按类型排序目录中的文件


PHP Sort Files In Directory by Type

我编写了以下PHP代码来显示目录中的文件。它使用JQuery展开文件夹。一切正常,但现在它显示所有的文件按字母顺序混合文件类型。

我想保持字母顺序,但文件夹和文件分开显示。如何对显示的文件进行排序,使文件夹显示在上面,其他文件显示在下面?

换句话说,我如何按文件类型对文件进行排序?

非常感谢!

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

你应该做的第一件事是将获取/排序文件和显示文件的逻辑分开,这将使自定义更容易。

这是一个有效的解决方案(今天早上有一些空闲时间:)

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样式)