2009-02-12 16 views
15

sto leggendo attraverso una directory con alcune immagini e tale utilizzando una piuttosto semplice implementazione di readdir() come il seguente:PHP readdir() non tornare i file in ordine alfabetico

if ($handle = opendir($path)) { 
    while (false !== ($szFilename = readdir($handle))) { 
    if ($szFilename[0] !== '.') { 
     if (is_file($path.$szFilename)) { 
       // do stuff 
      } 
     } 
    } 
} 

Il problema che sto avendo è che i file non vengono letti in ordine alfabetico, come la documentazione per readdir stato():

Restituisce il nome del file successivo dalla directory. I nomi file sono restituiti nell'ordine in cui sono memorizzati dal filesystem .

Un'altra cosa strana è che, sul server di test locale, lo stesso codice funziona alla grande. Questo è in esecuzione su un server utilizzando lo stack LAMP in entrambi i casi.

So che posso creare un array e solo ordinarlo, ma mi chiedevo se mi mancava qualcosa in quello che stavo facendo.

risposta

28

ordine alfabetico :: penso che letto male il frammento che hai citato ...

Restituisce il nome del file successivo dalla directory. I nomi dei file vengono restituiti nell'ordine in cui sono memorizzati dal filesystem.

Il fatto che "ls" visualizzi i file in ordine alfabetico (di solito) non significa che siano memorizzati sul file system. PHP si sta comportando come spec, temo.

Si consiglia di considerare l'utilizzo di scandir come base per i propri sforzi, se l'ordinamento alfabetico è obbligatorio.:)

+2

/me schiaffi sulla fronte scandir() è quello che stavo cercando. Grazie! – Buggabill

+1

BTW: ls -U elenca i file nell'ordine in cui le loro voci di directory sono memorizzate nella directory. –

+0

La funzione 'glob()' può anche aiutare qui. http://php.net/glob Per impostazione predefinita restituisce i file ordinati alfabeticamente. –

4

suppongo che i documenti siano abbastanza chiari qui.

ordine in cui sono memorizzati in file system

non è lo stesso di ordine alfabetico

+0

mayb e ha memorizzato le immagini sul tuo server di test in ordine alfabetico, rendendo quindi l'ordine memorizzato uguale all'ordine alfabetico – Jacco

+0

l'ordine non è garantito come alfabetico. questo è ciò che dicono i dottori. – SilentGhost

+0

I documenti non dicono che l'ordine non è garantito per essere alfabetico. Non direi che sono "abbastanza chiari" sul fatto che l'ordine del file system è diverso dall'ordine alfabetico. I documenti non dicono nulla di alfabetico. Potrebbero essere più chiari sulla differenza. –

1

Stai fraintendendo la documentazione:

I nomi dei file vengono restituiti nel ordine in cui sono memorizzati dal filesystem.

significa che i file vengono restituiti nell'ordine in cui sono stati creati.

+1

nitpick: _probably_ significa l'ordine in cui sono stati creati =) è possibile creare un filesystem che restituisca i file in un altro ordine, immagino. – gnud

12

Si potrebbe copiare tutti i nomi dei file in un array e quindi utilizzare

<?php 
sort($filesArray); 
?> 
-1

Ci sono un paio è possibile utilizzare:

alfabetico Ordina:

<?php 
sort($handle); 
?> 

inversione alfabetico Ordina :

<?php 
rsort($handle); 
?> 
+0

'$ handle' nell'OP è un [' risorsa'] (http://php.net/manual/en/language.types.resource.php), che né ['sort'] (http: // php .net/manual/it/function.sort.php) né ['rsort'] (http://php.net/manual/en/function.rsort.php) accetta. Uno avrebbe bisogno di tirare l'intero array in memoria e quindi chiamare 'sort()' o 'rsort()'. Se uno si preoccupa di farlo, si potrebbe anche usare 'scandir' in tutte le moderne implementazioni PHP. – bishop

Problemi correlati