2008-09-24 8 views
42

J'essaie d'afficher un tableau de fichiers dans l'ordre de la date (dernière modification). J'ai fait ce looping acheter à travers le tableau et le trier dans un autre tableau, mais y at-il un moyen plus facile (plus efficace) de faire cela?glob() - trier par date

+1

Avez-vous trouvé cela? (Juste fait une recherche Google sur le titre de votre question): http://www.webdeveloper.com/forum/showthread.php?t=188670 – John

Répondre

83

Pour la postérité, dans le cas où le poste de forum lié à la réponse acceptée est perdue ou peu claire à certains, le code correspondant nécessaire est:

<?php 

$myarray = glob("*.*"); 
usort($myarray, create_function('$a,$b', 'return filemtime($a) - filemtime($b);')); 

?> 

testé ce sur mon système et vérifié qu'il ne sorte par fichier mtime comme désiré. J'ai utilisé une approche similaire (écrite en Python) pour déterminer les derniers fichiers mis à jour sur mon site.

+10

A travaillé magnifiquement. Je voulais l'ordre inverse, donc j'ai inversé $ a avec $ b dans le champ de définition de la fonction. Merci Jay! – AVProgrammer

+3

Je viens de l'utiliser à nouveau. Pour la postérité en effet! – AVProgrammer

+3

Ce code accède au système de fichiers chaque fois qu'une comparaison est effectuée (plusieurs fois pour chaque fichier). Selon l'emplacement de votre système de fichiers, cela peut être très lent. En outre, si l'un des fichiers est écrit pendant le tri, alors la modification des temps de fichier pourrait conduire à des résultats de tri bizarres, en fonction de l'algorithme utilisé par usort. Je recommanderais [l'autre réponse] (http://stackoverflow.com/a/3298787/706054), qui évite tous ces problèmes. – Matt

32
<?php 
$items = glob('*', GLOB_NOSORT); 
array_multisort(array_map('filemtime', $items), SORT_NUMERIC, SORT_DESC, $items); 
+0

Cela n'a pas de sens de passer le résultat de 'array_map' en tant qu'argument destiné à être transmis par référence. Vous allez trier mais alors quoi? Vous ne l'avez plus. – Okonomiyaki3000

+1

Le résultat de 'array_map' est utilisé pour trier le tableau' $ items', qui est également transmis par référence. –

+1

Je vois. Je suppose que cela fonctionnera, une approche similaire est même documentée sur la page 'array_multisort' de php.net. Je pense qu'il y a des fonctions plus appropriées pour cette tâche mais je vais reprendre mon downvote. Ou je le ferais si je pouvais ... désolé. – Okonomiyaki3000

7

Cette solution est la même que accepted answer, mis à jour avec fonction anonyme :

$myarray = glob("*.*"); 

usort($myarray, function($a, $b) { return filemtime($a) - filemtime($b); }); 

Anonymous functions ont été introduites en PHP en 2010. réponse originale est datée 2008.