splincodewd
@splincodewd
Developer

Как правильно отсортировать по количеству вхождений на php?

На собеседовании дали такое задание:

Есть файл с текстом. Текст может содержать любые символы. Нужно выбрать из него все уникальные слова, посчитать для каждого слова количество вхождений (сколько раз встречается в тексте), потом отсортировать все слова по количеству вхождений, алфавиту и длине слова (от меньшего к большему) и сохранить результат в файл в виде списка слово-вхождение.

Пример списка:

олень 9
кот 8
лось 8
бык 5
быки 5
Пояснение по сортировке: если у первого слова больше вхождений, чем у второго, то первое в списке будет выше. Если у них поровну вхождений, то выше будет то, которое идет первым по алфавиту. Если слова начинаются одинаково ("бык" и "быки"), то первым идет то, которое короче. Словом считается последовательность из букв русского (а-б) или латинского (a-z) алфавитов. Регистр не имеет значения.

Сам код реализации выложил тут:
https://github.com/splincode/codework/tree/master/...

Можете провести некоторое код ревью уважаемые пользователи, и сказать как можно сделать лучше?
  • Вопрос задан
  • 477 просмотров
Решения вопроса 1
@SharuPoNemnogu
не язык плохой, программисты такие...
Сначала по коду.
Почитайте все таки PSR.. после методов скобка { переносится на новую строку. Ставить ; после закрывающей } не нужно.
Блоки кода if оборачивайте в {} даже если там 1 строка.
Половина названий методов в camelCase половина в snake_case, определитесь (лучше к первому).
комментарии **** PUBLIC *** мусор. Пишите перед методами public function, как и в случае с private.
Именуйте файлы согласно имени класса, используйте namespase'ы.
Не понятно зачем в контексте данной задачи интерфейс, и уж тем более, зачем в интерфейсе конструктор.

Теперь по задаче.
Не обязательно в рамках маленькой задачки писать громадные конструкции, чтобы показать все, что вы знаете. Работодатель хочет посмотреть на то, как вы мыслите и как решаете задачу, а примеры кода можно показать отдельно.
function countAndSort($string)
{
    preg_match_all("/[a-zа-я]+/ium", $string, $words);

    $counts = array_count_values(array_map('mb_strtolower', $words[0]));
    $words = array_keys($counts);

    array_multisort($counts, SORT_NUMERIC, SORT_DESC,
        $words, SORT_STRING);

    return array_map(function($a, $b) {
                            return "$a $b";
                        }, $words, $counts);
}

$str = "лось  бык кот кот кот кот лось лось лось бык бык бык быки  быки  быки  быки олень олень олень олень олень олень олень  олень олень
кот лось лось ,быки лось кот кот кот лось бык";

echo "<pre>";
print_r(countAndSort($str));
echo "</pre>";
die();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы