问题 按PHP中的创建/修改日期排序文件[重复]


可能重复:
文件创建时间 

在PHP中,如何检索包含在按创建日期(或任何其他排序机制)排序的文件夹中的文件?

根据文件READDIR() 功能:

文件名在。中返回   它们存储的顺序   文件系统。


12193
2018-02-24 11:47


起源



答案:


将它们的信息保存到数组中,对数组进行排序,然后循环数组

if($h = opendir($dir)) {
  $files = array();
  while(($file = readdir($h) !== FALSE)
    $files[] = stat($file);

  // do the sort
  usort($files, 'your_sorting_function');

  // do something with the files
  foreach($files as $file) {
    echo htmlspecialchars($file);
  }
}

8
2018-02-24 11:49





这是我的解决方案:

$fileList = array();
$files = glob('home/dir/*.txt');
foreach ($files as $file) {
    $fileList[filemtime($file)] = $file;
}
ksort($fileList);
$fileList = array_reverse($fileList, TRUE);
print_r($filelist);

输出是这样的:

array(
    (int) 1340625301 => '/home/dir/file15462.txt',
    (int) 1340516112 => '/home/dir/file165567.txt',
    (int) 1340401114 => '/home/dir/file16767.txt'
)

然后使用“foreach”循环获取所需的文件。


5
2018-06-25 16:30



让我们希望你的文件都不会在unix时间的同一秒内被修改。 - salathe
@salathe好点! - trante
我用以下代码替换了foreach体系:$ fileList [filemtime($ file)。$ file] = $ file;它解决了salathe提到的问题。我的印象是这个键转换为字符串也使得我的300k文件的ksort更快。 - Albert Hendriks
当有两个具有SAME创建日期的文件时,将无法工作: - / - powtac


答案:


将它们的信息保存到数组中,对数组进行排序,然后循环数组

if($h = opendir($dir)) {
  $files = array();
  while(($file = readdir($h) !== FALSE)
    $files[] = stat($file);

  // do the sort
  usort($files, 'your_sorting_function');

  // do something with the files
  foreach($files as $file) {
    echo htmlspecialchars($file);
  }
}

8
2018-02-24 11:49





这是我的解决方案:

$fileList = array();
$files = glob('home/dir/*.txt');
foreach ($files as $file) {
    $fileList[filemtime($file)] = $file;
}
ksort($fileList);
$fileList = array_reverse($fileList, TRUE);
print_r($filelist);

输出是这样的:

array(
    (int) 1340625301 => '/home/dir/file15462.txt',
    (int) 1340516112 => '/home/dir/file165567.txt',
    (int) 1340401114 => '/home/dir/file16767.txt'
)

然后使用“foreach”循环获取所需的文件。


5
2018-06-25 16:30



让我们希望你的文件都不会在unix时间的同一秒内被修改。 - salathe
@salathe好点! - trante
我用以下代码替换了foreach体系:$ fileList [filemtime($ file)。$ file] = $ file;它解决了salathe提到的问题。我的印象是这个键转换为字符串也使得我的300k文件的ksort更快。 - Albert Hendriks
当有两个具有SAME创建日期的文件时,将无法工作: - / - powtac


您可以将文件存储在一个数组中,其中键是文件名,值是要排序的值(即创建日期)和使用 asort() 在那个阵列上。

$files = array(
    'file1.txt' => 1267012304,
    'file3.txt' => 1267011892,
    'file2.txt' => 1266971321,
);
asort($files);
var_dump(array_keys($files));
# Output:
array(3) {
  [0]=>
  string(9) "file2.txt"
  [1]=>
  string(9) "file3.txt"
  [2]=>
  string(9) "file1.txt"
}

3
2018-02-24 11:51





嘿,甚至不是伟大的 DirectoryIterator 可以做到开箱即用。叹。

似乎有一个非常强大的脚本来完成这里引用的所有内容: preg_find。我从来没有使用它,但它看起来不错。

sorted in by filesize, in descending order?
$files = preg_find('/./', $dir,
  PREG_FIND_RECURSIVE| PREG_FIND_RETURNASSOC |
  PREG_FIND_SORTFILESIZE|PREG_FIND_SORTDESC);

$files=array_keys($files);

2
2018-02-24 11:50





你可以用 scandir() 将目录的内容读入数组,然后使用 fileatime() 要么 filectime() 分别查看每个文件的访问权限或创建时间。从这里对数组进行排序不应该太难。


0
2018-02-24 11:50





使用 了shell_exec 在os-level上执行命令?在linux / unix盒子上,这可能会起作用;

$output=shell_exec('ls -t1');

-2
2018-02-24 11:56



...请不要。 - knittl