<?php
//Топ 3 самых часто встречающихся слов и словосочетаний в тексте(из 2-3-х слов)
mb_internal_encoding('Utf-8');

$stopWords = array('и', 'у', 'к', 'с', 'о', 'от', 'в', 'же', 'из', 'на', 'что');
$input = 'Эта функция сортирует массив в обратном порядке таким образом, что
сохраняются отношения между ключами и значениями. Сохраняются отношения и
сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.';

//Удаляем лишнее и разбиваем текст на слова
$input = mb_strtolower($input);
$input = preg_replace('/[\\r\\n]/', ' ', $input);
$input = preg_replace('/[,]/', '', $input);
$input = preg_replace('/[.]/', ' .', $input);
$words = preg_split('/ /', $input, 0, PREG_SPLIT_NO_EMPTY);

foreach ($words as $key => $word) {
    //Прерываем цикл на последнем слове.
    if ($key == (count($words) - 1)) {
        break;
    }
    //Если текущее слово из списка стоп слов или точка - переходим к следуещему
    if ((array_search($word, $stopWords) !== false) || $word == '.') {
        continue;
    }
    $nextKey = $key + 1;
    //Если следующее слово из стоп слов или точка переходим к следуещему слову
    if ((array_search($words[$nextKey], $stopWords) !== false) || $words[$nextKey] == '.') {
        continue;
    }
    //Если же текущее и следующее слово в порядке составляем словосочетание из 2-х слов
    $twoWords[] = $word . ' ' . $words[$nextKey];
}
print_r($words);
print_r($twoWords);

//Считаем, удаляем все что было найдено 1 раз и стоп слова, сортируем
//$countWords1 = array_diff($words, $stopWords);
//$countWords1 = array_diff(array_count_values($words), array(1));
//$countWords2 = array_diff(array_count_values($twoWords), array(1));
//$countWords3 = array_diff(array_count_values($threeWords), array(1));

//arsort($countWords1, SORT_NUMERIC);
//arsort($countWords2, SORT_NUMERIC);
//arsort($countWords3, SORT_NUMERIC);

//print_r($countWords1);
//print_r($countWords2);
//print_r($countWords3);