Первое, что вы должны сделать, это разделить логику получения / сортировки файлов и их отображения, что облегчит настройку ..
Вот рабочее решение (сегодня утром у нас было свободное время:)
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)