Используете только PHP? Самое простое, что я могу придумать, это:
- Добавить каждую фразу в массив
- Получить первую фразу из массива и удалить ее
- Найдите количество фраз, которые соответствуют ему, и удалите их, сохраняя количество совпадений
- Вставить фразу и количество совпадений в новый массив
- Повторять до тех пор, пока начальный массив не станет пустым
Я - мусор для формальной CS, но я считаю, что это сложность n^2
, особенно включающая n(n-1)/2
сравнения в худшем случае. Я не сомневаюсь, что есть лучший способ сделать это, но вы упомянули, что эффективность не является проблемой, так что это подойдет.
Код следует (я использовал новую функцию, array_keys , которая принимает параметр поиска):
// assign the source text to $text
$text = file_get_contents('mytext.txt');
// there are other ways to do this, like preg_match_all,
// but this is computationally the simplest
$phrases = explode('.', $text);
// filter the phrases
// if you're in PHP5, you can use a foreach loop here
$num_phrases = count($phrases);
for($i = 0; $i < $num_phrases; $i++) {
$phrases[$i] = trim($phrases[$i]);
}
$counts = array();
while(count($phrases) > 0) {
$p = array_shift($phrases);
$keys = array_keys($phrases, $p);
$c = count($keys);
$counts[$p] = $c + 1;
if($c > 0) {
foreach($keys as $key) {
unset($phrases[$key]);
}
}
}
print_r($counts);
Просмотр в действии: http://ideone.com/htDSC