我编写了以下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样式)