Список и сортировка файлов с помощью PHP DirectoryIterator
Я использую DirectoryIterator для создания связанного списка PDF-файлов. (Также есть некоторый код для разделения имени файла, чтобы сделать список более удобным для пользователя.) Я хотел бы отсортировать результаты по имени файла, но не могу понять, как это сделать. Я знаю, что мне нужно поместить результаты в массив, а затем отсортировать массив. Но я нигде не могу найти пример, который бы делал это так, как я, поэтому я не могу понять, как интегрировать массив/сортировку в свой код, так как мой PHP слаб. Может ли кто-нибудь одолжить помочь?
(путь $ объявлен в другом месте страницы)
<?php
if (is_dir($path))
{
print '<ul>';
foreach (new DirectoryIterator($path) as $file)
{
if ($file->isDot()) continue;
$fileName = $file->getFilename();
$pieces = explode('.', $fileName);
$date = explode('-', $pieces[2]);
$filetypes = array(
"pdf",
"PDF"
);
$filetype = pathinfo($file, PATHINFO_EXTENSION);
if (in_array(strtolower($filetype), $filetypes))
{
print '<li><a href="' . $path . '' . $fileName . '">' . $pieces[2] . '</a></li>';
}
}
print '</ul>';
}
else
{
print $namePreferred . ' are not ready.</p>';
}
?>
1 answers
Размещение ваших допустимых файлов в массив с различными столбцами, по которым вы можете сортировать, вероятно, лучший выбор, и при этом ассоциированный.
Я использовал asort() " Сортируйте массив и поддерживайте ассоциацию индексов"с, я думаю, наилучшим образом соответствует вашим требованиям.
if (is_dir($path)) {
$FoundFiles = array();
foreach (new DirectoryIterator($path) as $file) {
if ($file->isDot())
continue;
$fileName = $file->getFilename();
$pieces = explode('.', $fileName);
$date = explode('-', $pieces[2]);
$filetypes = array(
"pdf",
"PDF"
);
$filetype = pathinfo($file, PATHINFO_EXTENSION);
if ( in_array( strtolower( $filetype ), $filetypes )) {
/**
* Place into an Array
**/
$FoundFiles[] = array(
"fileName" => $fileName,
"date" => $date
);
}
}
}
Перед сортировкой
print_r( $FoundFiles );
Array
(
[0] => Array
(
[fileName] => readme.pdf
[date] => 22/01/23
)
[1] => Array
(
[fileName] => zibra.pdf
[date] => 22/01/53
)
[2] => Array
(
[fileName] => animate.pdf
[date] => 22/01/53
)
)
После сортировки asort()
/**
* Sort the Array by FileName (The first key)
* We'll be using asort()
**/
asort( $FoundFiles );
/**
* After Sorting
**/
print_r( $FoundFiles );
Array
(
[2] => Array
(
[fileName] => animate.pdf
[date] => 22/01/53
)
[0] => Array
(
[fileName] => readme.pdf
[date] => 22/01/23
)
[1] => Array
(
[fileName] => zibra.pdf
[date] => 22/01/53
)
)
}
Затем для печати с помощью HTML после завершения функции - Ваш код сделал это, пока код находился в цикле, это означало, что вы не могли отсортировать его после того, как он уже был напечатан:
<ul>
<?php foreach( $FoundFiles as $File ): ?>
<li>File: <?php echo $File["fileName"] ?> - Date Uploaded: <?php echo $File["date"]; ?></li>
<?php endforeach; ?>
</ul>