php目录按数字顺序列出文件


php directory listing files in numerical order

如何更改此函数,使其按当前随机排序的顺序列出文件。我已经更改了它,所以它排除了Index.php文件。任何帮助都将不胜感激。

function DirDisply() {
$TrackDir=opendir(".");
while ($file = readdir($TrackDir)) {
$info = pathinfo($file);
$file_name =  basename($file,'.'.$info['extension']);
if ($file == "." || $file == ".." || $file == "index.php"){ }
else {
print "<p><a class=btn href=$file target=content>Item Number $file_name</a></p>";
}
}
closedir($TrackDir);
return;
}

考虑使用glob()并按照您想要的方式对数组进行排序。

如果您想要一些自然排序,您可以将scandir和natsort结合起来。

    $images = array_diff(scandir($the_path), array('..', '.'));
    natsort($images);
    foreach ($images as $img) {
        // TODO
    }

natsort从php.net自然排序:

该函数实现了一种排序算法,以人类的方式对字母数字字符串进行排序

这是一个字母顺序,但它处理类似文件名中的索引号:

file-2.jpg
file-1.jpg
file-10.jpg 

将订购

file-1.jpg
file-2.jpg
file-10.jpg 

另一方面,scandir只会按照字母顺序排序,比如:

file-1.jpg
file-10.jpg
file-2.jpg

如果你想继续使用readdir(),你必须在while循环中设置一个新的数组,然后按照你想要的顺序管理数组排序。

就我个人而言,我会切换到scandir(),因为它内置了排序选项,并且已经按字母顺序升序排序为数组(代码更少,更易于维护等):
http://www.php.net/manual/en/function.scandir.php

无论哪种方式,您都必须在数组上有foreach,因此scandir()是更好的方法,因为它也意味着没有while循环。

scandir()返回一个数组,这(可以说)比使用readdir()在文件夹中循环更容易管理,因为您可以一次检查最终结果。IE检查数组是一个数组,有键,值,循环它,检查循环上的每个,等等

然后,使用scandir()foreachscandir()返回的数组),而不是当前的while

请求的示例(尽管它只是来自php.net,但它是一个很好的基本示例):

$dir    = 'yourdir';
$files1 = scandir($dir);
$files2 = scandir($dir, 1);  //Reverse order
print_r($files1);
print_r($files2);

$files2中的1颠倒了顺序。默认排序顺序为升序(0,但无需指定),1表示降序
当然,您可以使用代码循环数组($files1):
print "<p><a class=btn href=$file target=content>Item Number $file_name</a></p>";
其中,您循环的数组的值将是您的文件名。

无论何时使用这些函数,您都应该在php网络上阅读这些函数。如果您在php.net上查找原始函数readdir(),则(几乎)总是有指向类似函数的链接,您会发现scandir();)

旁注:
而且你检查某事是否为某事,如果为真,什么都不做,否则就做某事。对于这种情况,这不是正确的方法
你应该做一些事情,如果它=某事,比如:

if ($file != "." || $file != ".." 
    || $file != "index.php")
  { 
    print "<p><a class=btn 
           href=$file target=content>Item Number $file_name</a></p>";
  }

你甚至可以让其他人报告错误或"没有文件"或其他什么。