Если вы хотите сохранить подход, основанный на стиле итератора (но все же по существу то же самое, что и ответ Artefacto), то достаточно чего-то вроде следующего.
$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());
}
Помимо: Если файлы особенно велики (читай: загрузка каждого из них целиком в память только для подсчета слов слишком много), то вы могли бы перебираем в файл построчно и строки (или байт, если вы действительно захотите) с SplFileObject
.
Он выводит файлы, но не упорядочивает их по wordcount – usertest
@user Вы уверены? В исходной версии было исправлено несколько ошибок. – Artefacto
Я думаю, что проблема заключается в том, что ksort организует ключ, который в этом случае является именем файла? – usertest