Как я могу перечислить все файлы в каталоге, отсортированном в алфавитном порядке с помощью PHP? - PullRequest
14 голосов
/ 20 октября 2010

Я использую следующий код PHP для отображения всех файлов и папок в текущем каталоге:

<?php
    $dirname = ".";
    $dir = opendir($dirname);

    while(false != ($file = readdir($dir)))
        {
          if(($file != ".") and ($file != "..") and ($file != "index.php"))
             {
              echo("<a href='$file'>$file</a> <br />");
        }
    }
?>

Проблема в том, что список не упорядочен по алфавиту (возможно, он отсортирован по дате создания? Я не уверен).

Как я могу убедиться, что отсортировано по алфавиту ?

Ответы [ 7 ]

35 голосов
/ 20 октября 2010

В руководстве четко сказано, что:

readdir
Возвращает имя файла следующего файла из каталога.Имена файлов возвращаются в порядке , в котором они хранятся в файловой системе .

Что вы можете сделать, это сохранить файлы в массиве, отсортировать их, а затем распечатать их содержимое как:

$files = array();
$dir = opendir('.'); // open the cwd..also do an err check.
while(false != ($file = readdir($dir))) {
        if(($file != ".") and ($file != "..") and ($file != "index.php")) {
                $files[] = $file; // put in array.
        }   
}

natsort($files); // sort.

// print.
foreach($files as $file) {
        echo("<a href='$file'>$file</a> <br />\n");
}
6 голосов
/ 28 февраля 2013
<?php
function getFiles(){
    $files=array();
    if($dir=opendir('.')){
        while($file=readdir($dir)){
            if($file!='.' && $file!='..' && $file!=basename(__FILE__)){
                $files[]=$file;
            }   
        }
        closedir($dir);
    }
    natsort($files); //sort
    return $files;
}
?>

<html>
<head>
</head>
<body>

<h1> List of files </h1>

<ul class="dir">
    <? foreach(getFiles() as $file)
        echo "<li name='$file'><a href='$file'>$file</a></li>";
    ?>
</ul>

</body>
</html>
2 голосов
/ 20 октября 2010
<?php
$dirname = ".";
$dir = opendir($dirname);

while(false != ($file = readdir($dir)))
{
if(($file != ".") and ($file != "..") and ($file != "index.php"))
{
  $list[] = $file;
}
}

sort($list);

foreach($list as $item) {
echo("<a href='$item'>$item</a> <br />");
}
?>
2 голосов
/ 20 октября 2010

Вы можете поместить все имена каталогов в массив, например:

$array[] = $file; 

После этого вы можете отсортировать массив по:

sort($array); 

, а затем распечатать ссылки с этим содержимым,

Надеюсь, это поможет.

1 голос
/ 20 октября 2010

Я бы порекомендовал отойти от старого opendir () / readdir ().Либо используйте glob (), либо, если вы столкнулись с большим количеством файлов в каталоге, используйте класс (ы) DirectoryIterator:

http://www.php.net/manual/en/class.directoryiterator.php http://www.php.net/manual/en/function.glob.php

С уважением

1 голос
/ 20 октября 2010

Использование glob и sort должно работать.

0 голосов
/ 23 июля 2013

Вы можете использовать этот красивый скрипт:

http://halgatewood.com/free-php-list-files-in-a-directory-script/

...