【问题标题】:PHP readdir() not returning files in orderPHP readdir()没有按顺序返回文件
【发布时间】:2018-04-04 17:36:26
【问题描述】:

我运行以下代码来列出目录中的文件。我想以某种方式对输出进行排序。最好是文件名或上传日期。这甚至可能吗?

<?php
  if ($handle = opendir('./xyz')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
          $thelist .= '<a href="./abc/xyz/'.$file.'">'.$file.'</a><br>';
        }
    }
  closedir($handle);
  }
?>
<h1>List of files:</h1>
<ul><?php echo $thelist; ?></ul>

编辑: 有更新的新代码。

<?php
array_multisort(array_map('filectime', $files = glob('./xyz/*.*')), SORT_DEC, $files);
?>

<h1>List of files:</h1>
<ul><?php foreach($files as $file) {
    echo '<a href="./abc/'.$file.'">'.$file.'</a><br>';
}
?></ul>

【问题讨论】:

标签: php sorting opendir


【解决方案1】:

您不能使用readdir 进行排序,它会按照它们在文件系统中的存储顺序读取它们。您可以将它们读入数组并对其进行排序。 array_multisort 效果很好,您可以将filectime 替换为其他功能:

array_multisort(array_map('filectime', $files = glob('./xyz/*.*')),
                SORT_ASC, $files);
  • 这会将所有文件放入数组$files,映射到filectime 以获取时间,对其进行排序,然后对$files 数组进行排序。

  • 对于字母顺序,只需在glob 之后使用sortrsort

一旦你有了排序后的数组,只需循环它并按原样显示或构建你的字符串:

foreach($files as $file) {
    echo '<a href="./abc/xyz/'.$file.'">'.basename($file).'</a><br>';
}

【讨论】:

  • 感谢您的快速回复。那么我将如何/在哪里将其实现到我的代码中?
  • 已编辑。构建数组,然后循环显示。
  • 太棒了!谢谢,这几乎是完美的。现在唯一的问题是它正在显示“./xyz/filename”。有什么办法让它只显示文件名但仍然有正确的链接?
  • 已添加basename
【解决方案2】:

您是否尝试过对数组中的名称进行一种转换,然后尝试排序?...看这个:是一个基本的排序功能

<?php $cars = array("Volvo", "BMW", "Toyota"); sort($cars); ?>

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2017-04-06
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多