【问题标题】:PHP Sort Files In Directory by TypePHP 按类型对目录中的文件进行排序
【发布时间】:2011-08-01 02:54:38
【问题描述】:

我编写了以下 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);
}
?>

【问题讨论】:

    标签: php sorting directory


    【解决方案1】:

    您应该做的第一件事是将获取/排序文件和显示它们的逻辑分开,这将使定制更容易..

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

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

    【讨论】:

    • @usnidorg。没有问题。编辑了我的帖子,顶部的目录略有变化
    • 谢谢!这正是我想做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多