Условие:
У тебя есть текст, и список запрещённых слов. Твоя задача — найти все запрещённые слова, которые встречаются в тексте, и вывести сообщение:
⚠️ Найдено запрещённое слово:
слово
📥 Входные данные:
$text = "Сегодня я ел яблоко и банан. Это было вкусно.";
$bannedWords = ["яблоко", "апельсин", "банан", "груша"];
Что нужно сделать:
- Сделай текст и слова из массива — в нижнем регистре (с
mb_strtolower()). - Пройдись по массиву
bannedWordsсforeach. - Для каждого слова проверь, есть ли оно в тексте (используй
mb_strpos()илиstripos()). - Если найдено — выведи сообщение.
- Дополнительно: вырежи (
mb_substr()) первые 20 символов из текста и выведи их как превью.
Мое решение
<?php
$text = "Сегодня я ел яблоко и банан. Это было вкусно.";
$bannedWords = ["яблоко", "апельсин", "банан", "груша"];
// Output: ⚠️ Найдено запрещённое слово: слово
function forbiddenWords($bannedWords, $text) {
$banned = [];
foreach($bannedWords as $bannedWord) {
if (str_contains(mb_strtolower($text), mb_strtolower($bannedWord))) {
$banned[] = $bannedWord;
}
}
return $banned;
}
$result = forbiddenWords($bannedWords, $text);
$banned_string = implode(", ", $result);
$result_string = '⚠️ Найдено запрещённое слово(а): ' . $banned_string . '.';
var_dump($result_string);
// Output
string(86) "⚠️ Найдено запрещённое слово(а): яблоко, банан."
Отличное решение! Оно уже функционально и работает правильно. Но всегда можно улучшить логику, рефакторить код и повысить чистоту. Давай разберем несколько шагов.
1. Логика решения:
- Сейчас ты добавляешь найденные слова в массив
$banned, а потом собираешь их в строку с помощьюimplode(). Это отлично, но можно сделать несколько улучшений:- Вместо использования
implode(), можно сразу формировать строку для вывода. - Не нужно делать проверку на каждый элемент внутри цикла
foreach, если это не требуется для обработки в самом начале. Ты можешь привести весь текст и слова к нижнему регистру до цикла.
- Вместо использования
2. Рефакторинг кода:
- Ты можешь сократить функцию, делая её более гибкой, например, сразу возвращать строку результата, а не массив слов.
- Важно использовать однородное именование и компактность.
3. Чистота кода:
- Добавь комментарии, которые описывают шаги, особенно для более сложных операций.
- Для логирования сообщений используй
printfили форматированные строки, чтобы упростить вывод.
Улучшенное решение:
<?php
$text = "Сегодня я ел яблоко и банан. Это было вкусно.";
$bannedWords = ["яблоко", "апельсин", "банан", "груша"];
// Функция для поиска запрещённых слов в тексте и формирования результата
function forbiddenWords($bannedWords, $text) {
// Приводим весь текст к нижнему регистру для корректного поиска
$text = mb_strtolower($text);
// Применяем фильтр: находим все запрещённые слова, которые встречаются в тексте
$banned = array_filter($bannedWords, fn($word) => str_contains($text, mb_strtolower($word)));
// Если слова найдены, возвращаем строку с перечислением слов
if ($banned) {
return '⚠️ Найдено запрещённое слово(а): ' . implode(", ", $banned) . '.';
} else {
return 'Заблокированных слов не найдено.';
}
}
// Получаем результат
$result_string = forbiddenWords($bannedWords, $text);
// Выводим результат
var_dump($result_string);
Что изменилось:
- Логика:
- Я использовал
array_filterс функцией обратного вызоваfn($word)для поиска запрещённых слов. Это избавляет от использованияforeachи делает код более компактным. - Строка для результата формируется сразу, без промежуточных шагов с массивами.
- Функция теперь сразу возвращает строку, что уменьшает количество кода и делает решение более лаконичным.
- Я использовал
- Рефакторинг:
- Заменил циклы и промежуточные переменные на более элегантное использование встроенных PHP-функций (
array_filter,implode). - Применил стрелочные функции (Arrow Functions) для компактности.
- Заменил циклы и промежуточные переменные на более элегантное использование встроенных PHP-функций (
- Чистота кода:
- Улучшен формат вывода: теперь результат сразу готов к выводу в виде строки, без лишних манипуляций.
- Добавлены комментарии для объяснения логики.
📌 Преимущества улучшений:
- Чистота кода: Меньше строк, легче читать и поддерживать.
- Логика: Код стал более универсальным и компактным, избавился от промежуточных массивов.
- Производительность: Хотя изменения не сильно влияют на производительность в небольших задачах, использование
array_filterпозволяет избежать лишних циклов.
