按文件类型对文件管理器数组进行排序

Posted

技术标签:

【中文标题】按文件类型对文件管理器数组进行排序【英文标题】:Sorting a file manager array by file type 【发布时间】:2016-01-23 15:24:06 【问题描述】:

我正在为我的用户创建一个文件管理器,它现在非常基本,并且列出了他们目录中的每个文件夹和文件。

<?php
  function getFileList($dir)
  
    // array to hold return value
    $retval = array();

    // add trailing slash if missing
    if(substr($dir, -1) != "/") $dir .= "/";

    // open pointer to directory and read list of files
    $d = @dir($dir) or die("getFileList: Failed opening directory $dir for reading");
    while(false !== ($entry = $d->read())) 
      // skip hidden files
      if($entry[0] == ".") continue;
      if(is_dir("$dir$entry")) 
        $retval[] = array(
          "name" => "$dir$entry/",
          "type" => filetype("$dir$entry"),
          "size" => 0,
          "lastmod" => filemtime("$dir$entry")
        );
       elseif(is_readable("$dir$entry")) 
        $retval[] = array(
          "name" => "$dir$entry",
          "type" => mime_content_type("$dir$entry"),
          "size" => filesize("$dir$entry"),
          "lastmod" => filemtime("$dir$entry")
        );
      
    
    $d->close();

    return $retval;
  
?>

然后它将这些信息回显到响应表中:

<table class="table table-striped table-bordered table-hover" id="dataTables-example">
                                    <thead>
                                        <tr>
                                            <th>Select</th>
                                            <th>Filename</th>
                                            <th>Type</th>
                                            <th>Last Modified</th>
                                            <th>Size</th>
                                            <th>Actions</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                    <?
 $dirlist = getFileList("../test/".$ref."");
  // output file list in html TABLE format
  foreach($dirlist as $file) 
      $files = $file['name'];
      $tmp = explode('../test/'.$ref.'/', $files);
      $filename = end($tmp);
      $filenames = rtrim($filename, '/');
  ?>
                                        <tr class="odd gradeX">           
                                            <td><input type="checkbox" name="test" value="test"></td>
                                            <td><a href="<? if($file['type'] == 'dir') echo 'user_filemanager.php?ref='.$ref.'/'.$filenames.'';  else  echo 'http://mysite.co.uk/test/'.$ref.'/'.$filenames.'';  ?>"><? echo $filenames; ?></a></td>
                                            <td><? echo $file['type']; ?></td>
                                            <td class="center"><? echo date('r', $file['lastmod']) ?></td>
                                            <td class="center"><? echo $file['size']; ?></td>
                                            <td class="center">X</td>
                                        </tr>
  <?
  
  ?>
                                    </tbody>
                                </table>

我遇到的问题是它随机输出数据。我希望它首先显示所有目录。在列出文件之前。所以所有目录都在顶部。这可能吗?目录当前显示为来自$file['type'];dir

【问题讨论】:

所以在输出前对结果数组进行排序。以usort 为例。 我已经查过了,但没有找到如何将它用于此类事情的示例? 【参考方案1】:

在您的情况下,usort 的简单示例是:

function getFileList($dir)

    // code here

    // sort by `type` key:
    usort($retval, function($a, $b)  return $a['type'] == 'dir'? -1 : 1; );

    return $retval;

【讨论】:

以上是关于按文件类型对文件管理器数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

JS 前端排序 数组指定项移动到最后

按多个键值对数据进行排序

在 C++ 中对字符串数组进行排序

Elasticsearch:使用处理器对数组进行排序

Elasticsearch:使用处理器对数组进行排序

从 ionic3 中的数组中按名字对 alist 进行排序