2010-10-20 21 views
13

estoy usando el siguiente código PHP para listar todos los archivos y carpetas bajo el directorio actual: (¿tal vez es ordenada por fecha de creación no estoy seguro)¿Cómo puedo enumerar todos los archivos en un directorio ordenados alfabéticamente usando 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 />"); 
     } 
    } 
?> 

El problema es lista no está ordenada alfabéticamente .

¿Cómo puedo asegurarme de que sea ordenado alfabéticamente?

Respuesta

31

El manual dice claramente que:

readdir
Devuelve el nombre del siguiente archivo del directorio. Los nombres de archivo se devuelven en el orden en el que están almacenados por el sistema de archivos.

Lo que puede hacer es almacenar los archivos en una matriz, clasificar y luego imprimir su contenido como:

$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"); 
} 
+0

esta es la primera vez que utilizo PHP. Solo necesito que liste algunas cosas que cargué en mi apache. ¿Podría mostrarme cómo almacenar los archivos en una matriz y ordenarlos? –

+1

+1 para natsort() podría incluso querer pensar en natcasesort() –

+1

@David podría usar '$ files = glob ("/your/path/* ");' –

1

Usando glob y sort que debería funcionar.

+2

no es necesario ordenar() si usa glob() porque ordena alfabéticamente de manera predeterminada –

2

se puede poner todos los nombres de directorio dentro de una matriz como:

$array[] = $file; 

Después de que se puede ordenar la matriz con:

sort($array); 

y luego imprimir los vínculos con ese contenido.

Espero que esta ayuda.

2
<?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 />"); 
} 
?> 
+1

Como una buena práctica, agregue '$ list = array();' antes de usarlo. –

1

Recomendaría alejarse del antiguo opendir()/readdir(). O bien utilizar glob() o si se encuentra con una gran cantidad de archivos de un directorio a continuación, utilizar la clase DirectoryIterator (ES):

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

Saludos

+0

Jan, ¿Cuál es el motivo para no usar openddir/readdir? Ninguno de los dos está en desuso. –

+0

porque OOP es el camino a seguir. Además, las clases de iterador tienen muchas características implementadas incorporadas en php, que tendrías que codificar manualmente cuando uses opendir(). Así que creo que esto también sería mejor por razones de rendimiento o seguridad. –

+0

http://en.wikipedia.org/wiki/No_Silver_Bullet :) –

4
<?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> 
Cuestiones relacionadas