【问题标题】:How to arrange files that are displayed using PHP如何排列使用 PHP 显示的文件
【发布时间】:2009-09-19 19:50:16
【问题描述】:
<div style="width: 49%; height: 300px; float: left; padding-top: 10px; ">

<h2><img src="downloads/general.png"></h2>

    <h1>General Downloads</h1>
    <?php
    $Dirdownloads = opendir('downloads/general');
while (false !== ($file = readdir($Dirdownloads))) {
    if ($file != "." && $file != "..") {
        $files[] = array(
            filemtime('downloads/general/'.$file),
            $file
        );
    }
}
closedir($Dirdownloads);
usort($files, create_function('$a, $b', 'return $a[0] - $b[0];'));
foreach ($files as $file) {
    echo '<a href="downloads/general/'.$file[1].'">'.$file[1].'</a><br />';
}
 ?>
 </div>

<div style="width: 49%; height: 300px; float: right; padding-top: 10px; ">

<h2><img src="downloads/conference.jpg"></h2>

    <h1>Conference Information</h1>
 <?php
    $Dirdownloads = opendir('downloads/conference');
while (false !== ($file = readdir($Dirdownloads))) {
    if ($file != "." && $file != "..") {
        $files[] = array(
            filemtime('downloads/conference/'.$file),
            $file
        );
    }
}
closedir($Dirdownloads);
usort($files, create_function('$a, $b', 'return $a[0] - $b[0];'));
foreach ($files as $file) {
    echo '<a href="downloads/conference/'.$file[1].'">'.$file[1].'</a><br />';
}
 ?>
 </div>

<div style="width: 49%; height: 300px; float: left; padding-top: 10px; ">

<h2><img src="downloads/newsletter.jpg"></h2>

    <h1>Newsletters</h1>
 <?php
    $Dirdownloads=opendir('downloads/newsletters');
    while (false !== ($file = readdir($Dirdownloads))) {
    if($file != "." && $file != ".."){
        echo '<a href="downloads/newsletters/'.$file.'">'.$file.'</a><br />';
    }
    }
    closedir($Dirdownloads);
 ?>
 </div>

<div style="width: 49%; height: 300px; float: right; padding-top: 10px; ">

<h2><img src="downloads/calendar.png"></h2> 

<h1>Calendar</h1>
 <?php
    $Dirdownloads=opendir('downloads/calendars');
    while (false !== ($file = readdir($Dirdownloads))) {
    if($file != "." && $file != ".."){
        echo '<a href="downloads/calendars/'.$file.'">'.$file.'</a><br />';
    }
    }
    closedir($Dirdownloads);
 ?>
 </div>

是代码,它显示某个文件夹中的所有文件,并允许您下载它们。它们目前是按名称排列的,我想以最新的优先顺序排列它们...帮助?

【问题讨论】:

  • 除了您处理排序顺序的任何操作外,您还可以考虑从重复的代码块中创建一个函数并将目录名称作为参数传递。
  • PHP 与 HTML 混合起来很糟糕。

标签: php file-management


【解决方案1】:

看:http://us2.php.net/manual/en/function.filemtime.php

基本上像这样组成一个二维数组:

数组:

[0]文件 [0]时间

[1]文件 [1]时间

[2]文件 [2]时间

...

以此类推,使用 filemtime() 返回的时间是 UNIX 格式。因此,您可以轻松创建一个按“时间”对列表进行排序的循环

【讨论】:

    【解决方案2】:

    收集数组中的文件,按创建日期排序,然后打印:

    $dir = 'downloads/general';
    $Dirdownloads = opendir($dir);
    while (false !== ($file = readdir($Dirdownloads))) {
        if ($file != "." && $file != "..") {
            $files[] = array(
                filectime($dir.'/'.$file),
                $file
            );
        }
    }
    closedir($Dirdownloads);
    
    // sort files by creation time
    usort($files, create_function('$a, $b', 'return $a[0] - $b[0];'));
    
    // print the files
    foreach ($files as $file) {
        echo '<a href="'.$dir.'/'.$file[1].'">'.$file[1].'</a><br />';
    }
    

    编辑    由于您想多次使用该算法,一个函数可能会有所帮助:

    function getFilesByCreationDate($dir) {
        $dir = rtrim($dir, '/');
        $handler = opendir($dir);
        while (false !== ($file = readdir($handler))) {
            if ($file != "." && $file != "..") {
                $files[] = array(
                    filectime($dir.'/'.$file),
                    $file
                );
            }
        }
        closedir($handler);
        usort($files, create_function('$a, $b', 'return $a[0] - $b[0];'));
        foreach ($files as &$file) {
            $file = $file[1];
        }
        return $files;
    }
    

    然后你像这样使用那个函数:

    $dir = 'downloads/general';
    $files = getFilesByCreationDate($dir);
    foreach ($files as $file) {
        echo '<a href="'.$dir.'/'.$file.'">'.$file.'</a><br />';
    }
    

    【讨论】:

    • 嗯,现在它不适用于我在页面上的其他类别(我在页面上有 4 个类别,每个类别显示 4 个文件夹。)我已经附上了整个页面的代码.. ...请编辑/添加我做错的任何事情。该页面现在显示在原始问题中。谢谢!
    • 抱歉听起来像个新手,但我该怎么做呢?
    【解决方案3】:

    如果你的文件列表足够小,你可以将它们读入数组,我要做的是将它们读入所述数组,然后使用usort 和自定义比较函数,filemtimes 将它们找出哪个文件较新。

    usort 的参数是数组本身,以及一个回调,它指定一个函数,该函数本身接收数组的两个元素作为参数,如果第一个参数小于第二个参数,则返回负数,如果它们相等则返回 0 ,如果第一个更大,则为正。

    【讨论】:

    • 是的,列表中有 5 个文件……但是,我在每页上有 4 个列表。你可以发布实际的代码来对它们进行排序吗?这个 php 的东西让我很困惑:P
    • stat() 会产生额外的数据,这会导致性能变慢(尽管可以忽略不计)。我会使用 filemtime() 除非 steven 打算显示 stat() 提供的额外文件详细信息。
    【解决方案4】:

    你必须:

    • 首先,获取文件列表,其中包含每个文件的最后修改日期(可以使用filemtime 获取)
    • 然后,使用用户函数对该列表进行排序,该用户函数根据数组中的“日期”字段进行排序(要使用用户定义的函数进行排序,请参阅usort
    • 最后显示列表

    例如,首先获取文件列表:

    $files = array();
    
    $dir = dirname(__FILE__);
    $Dirdownloads=opendir($dir);
    while (false !== ($file = readdir($Dirdownloads))) {
        if($file != "." && $file != ".."){
            $files[] = array(
                'name' => $file,
                'date' => filemtime($dir . '/' . $file),
            );
        }
    }
    closedir($Dirdownloads);
    

    请注意,对于每个文件,我都有一个包含“name”和“date”的数组。

    然后,对它们进行排序:

    usort($files, 'my_sort_function');
    

    还有,基于“date”字段比较文件的排序功能:

    function my_sort_function($a, $b) {
        if ($a['date'] == $b['date']) {
            return 0;
        }
        return ($a['date'] > $b['date']) ? -1 : 1;
    }
    

    有了这个,$file 数组应该包含你想要的:-)
    根据您想要的顺序,您将在排序函数中使用&gt;&lt;

    由您来遍历该列表,以显示链接!

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 2023-03-08
      • 1970-01-01
      • 2019-03-27
      • 2016-04-30
      相关资源
      最近更新 更多