2010-06-21 2 views
0

Я хотел бы,имен каталогов Списка по количеству слов файла

  1. Проверить слово рассчитывать на папку с текстовыми файлами.
  2. Вывести список файлов, расположенных по количеству слов в формате - FILENAME является WordCount

Я знаю str_word_count используется для получения отдельных wordcounts для файлов, но я не знаю, как изменить вывод.

Заранее спасибо.

ответ

1

Адаптировано для here.

<?php 
    $files = array(); 
    $it = new DirectoryIterator("/tmp"); 
    $it->rewind(); 
    while ($it->valid()) { 
     $count = str_word_count(file_get_contents($it->getFilename())); 
     $files[sprintf("%010d", $count) . $it->getFilename()] = 
      array($count, $it->getFilename()); 
     $it->next(); 
    } 

    ksort($files); 
    foreach ($files as $tup) { 
     echo sprintf("%s is %d\n", $tup[1], $tup[0]); 
    } 

EDIT Было бы более изящным иметь $file «s ключ быть имя файла и $file» значение s будет подсчитывать слово, а затем сортировать по значению.

+0

Он выводит файлы, но не упорядочивает их по wordcount – usertest

+0

@user Вы уверены? В исходной версии было исправлено несколько ошибок. – Artefacto

+0

Я думаю, что проблема заключается в том, что ksort организует ключ, который в этом случае является именем файла? – usertest

0

Я не использую PHP, но я бы

  1. создать массив для хранения файла и WordCount
  2. прочитать папку с текстом файлов и для каждого сохранения файла и WordCount к массив
  3. сортировать массив по WordCount
  4. выход массив

Чтобы сохранить информацию (# 2), я бы поместил информацию в 2D-массив. Более подробная информация о 2D-массивах here в Free PHP Tutorial. Таким образом, массив [0] [0] будет равен имени первого файла, а array 0 будет wordcount. array 1 [0] и массив 1 будет для следующего файла.

Для сортировки массива (# 3) вы можете использовать учебник firsttube.com.

Для вывода я бы сделал цикл через массив и вывел первое и второе местоположение.

for ($i = 0; $i < sizeof($array); ++$i) { 
    print the filename ($array[$i][0]) and wordcount ($array[$i][1]) 
} 
+0

Моя проблема - это шаг 3, как сохранить имя файла и счетчик вместе для вывода позже? – usertest

+0

@ user201140 - просто добавлено больше информации в ответ. Если у вас больше вопросов, вы можете задать вопрос. – Kyra

0

Если вы хотите сохранить подход, основанный на стиле итератора (но все же по существу то же самое, что и ответ 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.

Смежные вопросы