我在一个文本文件中有一个列表,其中包含英语中使用的前1000个单词。每行最多包含50个单词的列表,如下所示:
的,东西,是,东西,喜,再见,你好,一个,填料
冷静,免费,真棒的,祈祷,是,犯罪
等
我需要使用该文件作为输入编写代码,以使输出文件具有在至少50个不同列表中一起出现的单词对列表。例如,在上面的例子中,THE& IS出现在一起两次,但每隔一对只出现一次。
我无法存储所有可能的单词,所以没有蛮力。
我正在努力学习这门语言,而且我一直坚持这本书的练习。请帮忙。任何逻辑,指导或代码都可以帮助我。
这是我到目前为止所拥有的。它不符合预期,但我被卡住了:
代码:
//open the file
$handle = fopen("list.txt", 'r');
$count = 0;
$is = 0;
while(!feof($handle)) {
$line = fgets($handle);
$words = explode(',', $line);
echo $count . "<br /><br />";
print_r($words);
foreach ($words as $word) {
if ($word == "is") {
$is++;
}
}
echo "<br /><br />";
$count++;
}
echo "Is count: $is";
//close the file
fclose($handle);
$fp = fopen('output.txt', 'w');
fwrite($fp, "is count: " . $is);
fclose($fp);
这就是我想出来的,但我觉得它太过臃肿了:
计划:
检查$words
数组的第一个值
将值存储到$cur_word
将$cur_word
存储为数组中的键($compare
)和
将计数器(行号)存储为该键的值
在这一点上它将是1
看每行是否有$cur_word
,如果是,那么
将值放入$compare
,密钥为$cur_word
如果数组至少有50个值,则继续
否则转到$words
数组的下一个值
如果它有50个值则为
转到下一个值并做同样的事情
比较两个列表以查看有多少值匹配
如果它至少是50那么附加
输出文件中的单词
用每个单词重复这个过程
答案 0 :(得分:0)
这个问题可能有100种解决方案。这是一个
$contents = file_get_contents("list.txt");
//assuming all words are separated by a , and converting new lines to word separators as well
$all_words = explode(",", str_replace("\n", ",", $contents));
$unique_words = array();
foreach ($all_words as $word) {
$unique_words[$word] = $word;
}
这将为您提供数组中文件中的所有唯一单词。
您也可以使用相同的技术来计算单词
$word_counts = array();
foreach ($all_words as $word) {
if (array_key_exists($word, $word_counts)) {
$word_counts[$word]++;
} else {
$word_counts[$word] = 1;
}
}
然后你可以循环并保存结果
$fp = fopen("output.txt", "w");
foreach ($word_counts as $word => $count) {
fwrite($fp, $word . " occured " . $count . " times" . PHP_EOL);
}
fclose($fp);