2009-07-08 12 views
5

No estoy seguro de qué tan simple sería esto, pero estoy usando un script que muestra los archivos de una carpeta específica; sin embargo, me gustaría que se muestren en orden alfabético, ¿sería difícil hacer esto? Aquí está el código que estoy usando:PHP (carpeta) Lista de archivos en orden alfabético?

if ($handle = opendir($mainframe->getCfg('absolute_path') ."/images/store/")) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       if (($file != "index.html")&&($file != "index.php")&&($file != "Thumbs.db")) { 
       $strExt = end(explode(".", $file)); 
        if ($strExt == 'jpg') { 
         $Link = 'index.php?option=com_shop&task=deleteFile&file[]='.$file; 
         $thelist .= '<tr class="row0"><td nowrap="nowrap"><a href="'.$Link.'">'.$file.'</a></td>'."\n"; 
         $thelist .= '<td align="center" class="order"><a href="'.$Link.'" title="delete"><img src="/administrator/images/publish_x.png" width="16" height="16" alt="delete"></a></td></tr>'."\n"; 
        } 

       } 
      } 
     } 
     closedir($handle); 
    } 
    echo $thelist; 

:)

Respuesta

14

En lugar de utilizar readdir simplemente podría utilizar scandir (documentation) que ordena alfabéticamente por defecto.

El valor de retorno de scandir es una matriz en lugar de una cadena, por lo que su código debería ajustarse ligeramente para iterar sobre la matriz en lugar de comprobar el valor de retorno null final. Además, scandir toma una cadena con la ruta del directorio en lugar de un identificador de archivo como entrada, la nueva versión sería algo como esto:

foreach(scandir($mainframe->getCfg('absolute_path') ."/images/store/") as $file) { 
    // rest of the loop could remain unchanged 
} 
+0

Ah eso es increíble funciona como un amuleto, muchas gracias: D – SoulieBaby

+0

Encontré esta respuesta mientras trataba de resolver exactamente el mismo problema. ¡Gracias! Funcionó bien, y con menos código! – Agos

+0

Esto funcionó muy bien. Después de leer la documentación, incluso pude revertir el orden de clasificación con 'SCANDIR_SORT_DESCENDING' como segundo argumento para' scandir (...) '. Varias otras constantes de clasificación también se documentaron en el enlace proporcionado. –

3

Ese código se ve muy desordenado. Puede separar la lógica de desplazamiento de directorio con la presentación. Una versión mucho más concisa (en mi opinión):

<?php 

// Head of page 
$it = new DirectoryIterator($mainframe->getCfg('absolute_path') . '/images/store/')); 

foreach ($it as $file) { 
    if (preg_match('#\.jpe?g$#', $file->getFilename())) 
     $files[] = $file->getFilename(); 
} 
sort($files); 

// Further down 
foreach ($files as $file) 
    // display links to delete file. 
?> 

usted ni siquiera tiene que preocuparse de abrir o cerrar la manija, y puesto que usted está comprobando el nombre de archivo con una expresión regular, que no lo hacen necesita cualquiera de los controles explosivos o condicionales.

+1

Gracias lo probarán :) – SoulieBaby

2

me gusta Glob Hace directorio de la lectura de un broche de presión, ya que devuelve una matriz que es fácilmente clasificable:

<?php 
$files = glob("*.txt"); 
sort($files); 
foreach ($files as $filename) { 
    echo "$filename size " . filesize($filename) . "\n"; 
} 
?> 
1

Si está utilizando Joomla1.5 usted debe utilizar la constante definida JPATH_BASE en lugar de

$mainframe->getCfg('absolute_path') 

Si se trata de una extensión de Joomla que va a distribuir, no utiliza scandir() ya que es PHP5 solamente.

Lo mejor que se puede hacer es usar la API de Joomla. Tiene una clase para el acceso de directorio y archivo que tiene capas para hacer esto a través de diferentes redes y protocolos. Por lo tanto, el sistema de archivos puede estar sobre FTP, por ejemplo, y las clases se pueden extender para cualquier red/protocolo.

jimport('joomla.filesystem.folder'); 
$files = JFolder::files(JPATH_BASE."/images/store/"); 
sort($files); 
foreach($files as $file) { 
    // do your filtering and other task 
} 

También puede pasar una expresión regular como segundo parámetro a JFolder :: archivos() que filtra los archivos que reciba.

Tampoco desea utilizar literales de URL como/administrator/ya que se pueden cambiar. utilice los métodos de JURI como:

JURI :: base();

Si desea asegurarse de las clases CSS Joomla en las tablas, para:

'<tr class="row0">' 

uso:

'<tr class="row'.($i&1).'">' 

donde $ i es el número de iteraciones.Esto le da una secuencia de 0 y 1 alternantes.

1

si tenemos funciones integradas de PHP, siempre úselas, son más rápidas. use glob en lugar de carpetas de desplazamiento, si se ajusta a sus necesidades.

$ folder_names = array(); $ folder_names = glob ('*', GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT);

  • returs todo en el directorio actual, el uso chdir() antes de llamar a quitar el GLOB_ONLYDIR para incluir archivos también (. sería sólo archivos) GLOB_MARK es para agregar una barra de nombres de carpetas Quitar GLOB_NOSORT no ordenar la matriz
+1

No siempre. Si tiene una API estandarizada, úselo. En este caso particular, el código fue escrito para Joomla CMS. Por lo tanto, debe usar la API de Joomla. La velocidad rara vez es una preocupación en el desarrollo web. Buen diseño es. – bucabay

Cuestiones relacionadas