PHP Сортировка файлов в каталоге по типу - PullRequest
1 голос
/ 08 апреля 2011

Я написал следующий код 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);
}
?>

1 Ответ

2 голосов
/ 08 апреля 2011

Первое, что вы должны сделать, это разделить логику получения / сортировки файлов и их отображения, что облегчит настройку ..

Вот рабочее решение (сегодня утром у нас было свободное время:)

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...