簡體   English   中英

如何通過PHP修改日期對文件進行排序

[英]How to sort files by modified date through php

背景:我有一個匿名登錄ftp服務器,ftp_nlist只按字母順序列出文件,我想在最后修改日期的基礎上獲取文件列表,最近的第一個。 我嘗試了ftp_exec($ conn,“ls -t”),但我遇到了Permission Denied錯誤,不知道為什么它不起作用。 好吧,我正在使用php-cli,文件數量為數千,我只想使用最近的文件。 獲取原始列表,並找到數組元素的日期部分可能會有所幫助,但我希望有一個簡單的方法。 當我通過終端命令登錄時,ls -t工作得很好。 所以想知道為什么ftp_exec無法正常工作。

尋求一個簡單的建議。

提前致謝。

如果您只想按上次修改日期對文件進行排序,則可以使用

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包含按上次修改時間的升序排序的列表; 反轉sort函數以獲取最近修改的第一種格式的列表。

注意: ftp_rawlist不提供精確的修改時間戳,因此此代碼可能無法始終准確地工作。 您還應驗證FTP服務器的輸出是否與此算法一致,並包括一些健全性檢查以確保將來保持這種狀態。

試試這個我為這樣的任務寫的功能。 它設計用於本地文件系統,但只要您的系統啟用了allow_url_fopen ,它就可以使用ftp:// URL(盡管DIR_SORT_ATIMEDIR_SORT_CTIME不起作用):

// Constants to make usage more reader-friendly
define('DIR_SORT_NAME',  1);
define('DIR_SORT_SIZE',  2);
define('DIR_SORT_ATIME', 3);
define('DIR_SORT_MTIME', 4);
define('DIR_SORT_CTIME', 5);

function readdir_sorted_array ($dir, $sortCol = DIR_SORT_NAME, $sortDir = SORT_ASC) {

  // Validate arguments
  $dir = rtrim(str_replace('\\', '/', $dir), '/');
  $sortCol = (int) ($sortCol >= 1 && $sortCol <= 5) ? $sortCol : 1;
  $sortDir = ($sortDir == SORT_DESC) ? SORT_DESC : SORT_ASC;
  $name = $size = $aTime = $mTime = $cTime = $table = array();

  // Open the directory, return FALSE if we can't
  if (!is_dir($dir) || (!$dp = opendir($dir))) return FALSE;

  // Fetch a list of files in the directory and get stats
  for ($i = 0; ($file = readdir($dp)) !== FALSE; $i++) {
    if (!in_array($file, array('.','..'))) {
      $path = "$dir/$file";
      $row = array('name'=>$file,'size'=>filesize($path),'atime'=>fileatime($path),'mtime'=>filemtime($path),'ctime'=>filectime($path));
      $name[$i] = $row['name'];
      $size[$i] = $row['size'];
      $aTime[$i] = $row['atime'];
      $mTime[$i] = $row['mtime'];
      $cTime[$i] = $row['ctime'];
      $table[$i] = $row;
    }
  }

  // Sort the results
  switch ($sortCol) {
    case DIR_SORT_NAME:
      array_multisort($name, $sortDir, $table);
      break;
    case DIR_SORT_SIZE:
      array_multisort($size, $sortDir, $name, SORT_ASC, $table);
      break;
    case DIR_SORT_ATIME:
      array_multisort($aTime, $sortDir, $name, SORT_ASC, $table);
      break;
    case DIR_SORT_MTIME:
      array_multisort($mTime, $sortDir, $name, SORT_ASC, $table);
      break;
    case DIR_SORT_CTIME:
      array_multisort($cTime, $sortDir, $name, SORT_ASC, $table);
      break;
  }

  // Return the result
  return $table;

}

返回給定路徑中$dir的文件的已排序關聯數組。

看起來像“ftp_nlist”第二個arg采用與linux“ls”命令相同的args(OP不應該使用'ls',只是開關)

$dir_list = ftp_nlist($ftp_conn_id, '-rtla .');
print_r($dir_list);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM