Si vous souhaitez conserver l'approche de type itérateur (tout en faisant essentiellement la même chose que la réponse de Artefacto), alors quelque chose comme ce qui suit suffirait.
$dir_it = new FilesystemIterator("/tmp");
// Build array iterator with word counts
$arr_it = new ArrayIterator();
foreach ($dir_it as $fileinfo) {
// Skip non-files
if (! $fileinfo->isFile()) continue;
$fileinfo->word_count = str_word_count(file_get_contents($fileinfo->getPathname()));
$arr_it->append($fileinfo);
}
// Sort by word count descending
$arr_it->uasort(function($a, $b){
return $b->word_count - $a->word_count;
});
// Display sorted files and their word counts
foreach ($arr_it as $fileinfo) {
printf("%10d %s\n", $fileinfo->word_count, $fileinfo->getFilename());
}
Mis: Si les fichiers sont particulièrement importants (lire: charger chacun entièrement en mémoire juste pour compter les mots est trop) boucle vous pourriez alors sur la ligne par ligne fichier (ou byte-by-byte si vous voulez vraiment) avec le SplFileObject
.
Il sort les fichiers, mais ne les arrange pas par wordcount – usertest
@user Etes-vous sûr? La version initiale a eu quelques erreurs que j'aurais corrigé. – Artefacto
Je pense que le problème est que ksort dispose par clé, qui dans ce cas est le nom de fichier? – usertest