Как упорядочить файлы, которые отображаются с помощью PHP - PullRequest
0 голосов
/ 19 сентября 2009
<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>

Код, который отображает все файлы в определенной папке и позволяет загружать их. В настоящее время они располагаются по имени, и я хочу, чтобы они сначала упорядочились по новейшим ... Помощь?

Ответы [ 4 ]

1 голос
/ 19 сентября 2009

Соберите файлы в массив, отсортируйте их по дате создания и распечатайте их после этого:

$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 />';
}
1 голос
/ 19 сентября 2009

Посмотрите на: http://us2.php.net/manual/en/function.filemtime.php

В основном составьте двумерный массив следующим образом:

Массив:

[0] Файл [0] Время

[1] Файл [1] Время

[2] Файл [2] Время

...

И так далее, время, возвращаемое с помощью filemtime (), имеет формат UNIX. Итак, вы можете легко создать цикл, который сортирует список по «времени»

0 голосов
/ 19 сентября 2009

Вам нужно будет:

  • сначала получите список файлов, для каждого файла указывается дата его последнего изменения (его можно получить с помощью 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 должен содержать то, что вы хотите :-)
В зависимости от желаемого порядка, вы будете использовать > или < в функции сортировки.

До вас, чтобы перебрать этот список, чтобы отобразить ссылки!

0 голосов
/ 19 сентября 2009

Если ваш список файлов настолько мал, что вы действительно можете прочитать их в массив, то я бы прочитал их в указанном массиве, а затем использовал usort с пользовательской функцией сравнения, которая filemtime s, чтобы определить, какой файл более новый.

Аргументами для usort являются сам массив и обратный вызов, который определяет функцию, которая сама получает два элемента массива в качестве аргумента и возвращает отрицательный результат, если первый аргумент меньше второго, и 0, если они равны или положительным, если первое больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...