2010-06-21 78 views
0

我想,列出目錄文件名算

  1. 檢查字數一個完整的文本文件的文件夾。
  2. 輸出的字排列的文件列表格式數 - 文件名是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]); 
    } 

編輯這將是更優雅有$file的關鍵是文件名和$file的值是一個字一個值計數,然後排序。

+0

它會輸出文件,但不會按字數統計 – usertest 2010-06-21 17:35:00

+0

@user確定嗎?最初的版本有一些錯誤,我希望糾正。 – Artefacto 2010-06-21 17:44:53

+0

我認爲probem是ksort按鍵排列,在這種情況下是文件名? – usertest 2010-06-21 17:48:29

0

我不使用PHP的,但我會

  1. 創建數組來保存文件名和 單詞計數
  2. 通過充分的文本 文件,併爲每個文件夾讀保存的文件名 和單詞計數到陣列
  3. 排序陣列由單詞計數
  4. 輸出陣列

要存儲信息(#2),我會將信息放入二維數組中。在Free PHP Tutorial中有關於二維數組here的更多信息。因此array [0] [0]將等於第一個文件的名稱,而數組0將是wordcount。數組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 2010-06-21 17:25:46

+0

@ user201140 - 將更多信息添加到答案中。如果你有任何問題隨時問。 – Kyra 2010-06-21 17:37:04

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