我想,
我知道str_word_count用于获取文件的单个字数,但我不知道如何重新排列输出。
提前致谢。
答案 0 :(得分: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
的值为字数,然后按值排序会更优雅。< / p>
答案 1 :(得分:0)
我不使用php,但我会
要存储信息(#2),我会将信息放入2D数组中。在Free PHP Tutorial中有关于2D数组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])
}
答案 2 :(得分: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
逐字节。