2009-07-08 11 views
5

Non sono sicuro di quanto sarebbe semplice, ma sto usando uno script che visualizza i file da una cartella specifica, tuttavia mi piacerebbe che fossero visualizzati in ordine alfabetico, sarebbe difficile farlo? Ecco il codice che sto usando:Elenco di file PHP (cartella) in ordine alfabetico?

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; 

:)

risposta

14

Invece di utilizzare readdir si può semplicemente utilizzare scandir (documentation) che ordina alfabeticamente per impostazione predefinita.

Il valore di ritorno di scandir è una matrice anziché una stringa, pertanto è necessario regolare leggermente il codice per eseguire un'iterazione sull'array anziché verificare il valore di ritorno finale null. Inoltre, scandir prende una stringa con il percorso di directory invece di un handle di file come input, la nuova versione sarebbe simile a questa:

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

Ah è fantastico, funziona come un incantesimo, grazie mille: D – SoulieBaby

+0

Trovato questa risposta mentre cercavo di risolvere lo stesso problema esatto. Grazie! Ha funzionato bene e con meno codice! – Agos

+0

Questo ha funzionato alla grande. Dopo aver letto la documentazione, ero persino in grado di invertire l'ordine di ordinamento con 'SCANDIR_SORT_DESCENDING' come secondo argomento a' scandir (...) '. Diverse altre costanti di ordinamento sono state documentate anche nel link fornito. –

3

Quel codice sembra piuttosto disordinato. È possibile separare la logica di attraversamento della directory con la presentazione. Una versione molto più conciso (a mio parere):

<?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. 
?> 

Non c'è nemmeno bisogno di preoccuparsi di aprire o chiudere la maniglia, e dal momento che si sta controllando il nome del file con un'espressione regolare, non si bisogno di qualsiasi esplosione o controlli condizionali.

+1

Grazie proveremo :) – SoulieBaby

2

Mi piace Glob Rende directory lettura di un gioco da ragazzi in quanto restituisce una matrice che è facilmente ordinabile:

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

Se stai usando Joomla1.5 si dovrebbe utilizzare la costante definita JPATH_BASE invece di

$mainframe->getCfg('absolute_path') 

Se questo è un estensione di Joomla che si distribuirà, non si utilizza scandir() come è PHP5 solo.

La cosa migliore da fare è utilizzare l'API Joomla. Ha una classe per l'accesso a directory e file che è stratificata per fare ciò su diverse reti e protocolli. Quindi il file system può essere su FTP, per esempio, e le classi possono essere estese per qualsiasi rete/protocollo.

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

È inoltre possibile passare un'espressione regolare come secondo parametro per JFolder :: files() che filtra i file ricevuti.

Inoltre, non si desidera utilizzare valori letterali di URL come/administrator/poiché possono essere modificati. utilizzare i metodi JURI come:

JURI :: base();

Se si vuole fare in modo delle classi Joomla CSS nelle tabelle, per:

'<tr class="row0">' 

uso:

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

dove $ i è il numero di iterazioni.Questo ti dà una sequenza alternata di 0 e 1.

1

se abbiamo funzioni integrate PHP, usatelo sempre, sono più veloci. usa glob invece di attraversare cartelle, se si adatta alle tue esigenze.

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

  • returs tutto nella directory corrente, l'uso chdir() prima di chiamare rimuovere il GLOB_ONLYDIR per includere i file troppo (. sarebbe solo file) GLOB_MARK è per l'aggiunta di una barra per i nomi delle cartelle Rimuovere GLOB_NOSORT non ordinare l'array
+1

Non sempre. Se hai un'API standard, usa quella. In questo caso particolare, il codice è stato scritto per Joomla CMS. Quindi dovrebbe usare l'API Joomla. La velocità è raramente una preoccupazione nello sviluppo web. Il buon design è. – bucabay

Problemi correlati