我正在使用DirectoryIterator生成PDF文件的链接列表。 (还有一些代码来分解文件名以使列表更加用户友好。)我想按文件名对结果进行排序,但无法弄清楚如何。我知道我需要将结果放入数组中,然后对数组进行排序。但是,我无法在任何地方找到一个像我一样的例子,所以我无法弄清楚如何将数组/排序集成到我的代码中,因为我的PHP很弱。有人可以借助吗?
($ path在页面的其他地方声明)
<?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>';
}
?>
答案 0 :(得分:9)
将您的有效文件放入一个数组,其中包含您可以排序的各种列,这可能是最好的选择,同时也是一个合作伙伴。
我使用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>
答案 1 :(得分:1)
使用 scandir 代替 DirectoryIterator 来获取文件的排序列表:
$path = "../images/";
foreach (scandir($path) as $file){
if($file[0] == '.'){continue;}//hidden file
if( is_file($path.$file) ){
}else if( is_dir($path.$file) ){
}
}
scandir 区分大小写。对于不区分大小写的排序,请参见以下答案: How do you scan the directory case insensitive?