【问题标题】:Get specific number of files from a directory ordered by time modified从按修改时间排序的目录中获取特定数量的文件
【发布时间】:2013-10-20 04:52:02
【问题描述】:

我正在尝试编写一个函数,该函数返回按修改时间排序的文件名数组。 虽然我只想获取特定数量的文件,而不是目录中的整个文件。 总之,我想得到一个数组,其中包含目录中最新的 X 文件

这是我的代码:

    public static function GetPicsDir()
    {
        $results = array();
        $handler = opendir("pics");
        while ($file = readdir($handler)) {
          if ($file != "." && $file != "..") {
            $results[] = $file;
          }
        }
        closedir($handler);
        return $results;
    }

我不知道如何限制它并按时间排序。 我很乐意得到任何帮助。

谢谢

【问题讨论】:

    标签: php opendir


    【解决方案1】:

    使用filemtime():

    public static function GetPicsDir()
    {
        $results = array();
        $handler = opendir("pics");
        while ($file = readdir($handler)) {
          if ($file != "." && $file != "..") {
            $results[$time] = filemtime($file);
          }
        }
        arsort($results);
        closedir($handler);
        return $results;
    }
    

    【讨论】:

    • 我多次收到此错误:警告:filemtime(): stat failed for 00a0a75d63ceb4fbc898d1e7e320e129.png in C:\xampp\htdocs\Project\classes\Pics.php on line 136
    • @Nero:听起来像是文件编码问题。你可以试试filemtime(utf8_decode($file));
    【解决方案2】:

    您可以使用glob

    $date = strtotime('2013-01-10 10:00:00');//The date from you want to get the files
    $matches = glob('dir/*.*');
    $result=array();
    if (is_array($matches)) {
      $a=0;
      foreach ($matches as $filename) {
        if (filemtime($filename) >= $date) {//only output file >= your $date
          $result[$a]['FileName'] = $filename;
          $result[$a]['DateCreated'] = gmdate("Y-m-d H:i:s", filemtime($filename));
        }
          $a++;
      }
    }
    
    if(count($result)>=2){//order array if it has at least 1 match
       foreach ($result as $key => $row) {
          $new_array[$key] = $row['DateCreated'];
        }
     array_multisort($new_array,SORT_DESC,$result);//Show most recent first 
    }
    

    使用array_multisort按日期排序SORT_DESC

    echo '<pre>';
    print_r($result);
    echo '<pre>';
    

    输出:

    Array
    (
      [0] => Array
          (
              [FileName] => test.php
              [DateCreated] => 2013-10-20 05:43:06
          )
    
      [1] => Array
          (
              [FileName] => test.sql
              [DateCreated] => 2013-09-20 23:38:05
          )
    
      [2] => Array
          (
              [FileName] => general.php
              [DateCreated] => 2013-09-02 00:58:33
          )
    
    )
    

    【讨论】:

      【解决方案3】:

      如果您只想按最后修改日期对文件进行排序,您可以使用

      ftp_nlist($conn, '-t .');
      

      不过,这不会告诉您每个文件的日期。

      如果您还想获取修改日期,可以使用 ftp_rawlist 并解析输出。这是我拼凑的一个简单示例:

      $list = ftp_rawlist($ftp, '.');
      
      $results = array();
      foreach ($list as $line) {
          list($perms, $links, $user, $group, $size, $d1, $d2, $d3, $name) =
              preg_split('/\s+/', $line, 9);
          $stamp = strtotime(implode(' ', array($d1, $d2, $d3)));
          $results[] = array('name' => $name, 'timestamp' => $stamp);
      }
      
      usort($results, function($a, $b) { return $a['timestamp'] - $b['timestamp']; });
      

      此时$results包含了一个按上次修改时间升序排序的列表;反转排序函数以获取最近修改的第一种格式的列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        相关资源
        最近更新 更多