2010-01-21 11 views
3

Comment puis-je lister les 5 premiers fichiers ou répertoires dans le répertoire triés par ordre alphabétique avec PHP?Comment puis-je trouver les 5 premiers fichiers dans un répertoire avec PHP?

+4

avez-vous besoin d'être * les 5 premiers lorsqu'ils sont triés en fonction de *, ou seulement des 5 fichiers? – Wim

+1

Personne qui crée une belle réponse 'glob', en utilisant un motif pour filtrer les répertoires? – Veger

+0

@Veger: Juste fait. : P –

Répondre

17

En utilisant scandir():

array_slice(array_filter(scandir('/path/to/dir/'), 'is_file'), 0, 5); 

Le array_filter() ainsi que le rappel de la fonction is_file() fait que nous traitons simplement des fichiers sans avoir à écrire une boucle, nous n'avons même pas à nous soucier de . et .. car ce sont des répertoires.


Ou en utilisant glob()-il ne correspond pas à des noms comme .htaccess:

array_slice(glob('/path/to/dir/*.*'), 0, 5); 

Ou en utilisant glob() + array_filter()-celui-ci correspondra les noms de fichiers comme .htaccess:

array_slice(array_filter(glob('/path/to/dir/*'), 'is_file'), 0, 5); 
+2

+1 car il ne retourne pas les répertoires – Gordon

+2

+1 très belle solution! – jspcal

+0

@jpscal: Merci! =) –

1

Si vous pensez faible niveau (rangé par numéro d'inode), alors readdir est la fonction pour vous.

Sinon, si vous voulez les alphabétiques, alors scandir pourrait être une meilleure option. Comme dans:

$firstfive = array_slice(scandir("."), 2, 5); 

Notez que les deux premières entrées sont renvoyées par scandir « » et "..".

+0

J'aime scandir. Mais est-ce que ça ne scanne pas tous les fichiers dans un répertoire? – usertest

+1

Qu'en est-il des répertoires? – Veger

1

Il est probablement plus simple d'utiliser scandir, sauf si vous voulez faire quelque chose d'un peu plus complexe. scandir renvoie les répertoires aussi bien, donc nous allons filtrer les fichiers permettent seulement:

$items = scandir('/path/to/dir'); 
$files = array(); 
for($i = 0, $i < 5 && $i < count($items); $i++) { 
    $fn = '/path/to/dir/' . $items[$i]; 
    if(is_file($fn)) { 
     $files[] = $fn; 
    } 
} 
+0

'$ i <5' devrait être remplacé par' count ($ files) <5' – Veger

+0

Devrait-il? '$ i <5' et' count ($ files) <5' sont à peu près les mêmes, même si '$ i <5' serait marginalement plus rapide car il n'appelle pas une fonction –

+1

$ i est aussi 5 quand 5 répertoires sont trouvés ... Et l'OP veut des fichiers – Veger