Задача: список запрещённых слов
Glossary overview

Задача: список запрещённых слов

Условие:

У тебя есть текст, и список запрещённых слов. Твоя задача — найти все запрещённые слова, которые встречаются в тексте, и вывести сообщение:

⚠️ Найдено запрещённое слово: слово

📥 Входные данные:

$text = "Сегодня я ел яблоко и банан. Это было вкусно.";
$bannedWords = ["яблоко", "апельсин", "банан", "груша"];

Что нужно сделать:

  1. Сделай текст и слова из массива — в нижнем регистреmb_strtolower()).
  2. Пройдись по массиву bannedWords с foreach.
  3. Для каждого слова проверь, есть ли оно в тексте (используй mb_strpos() или stripos()).
  4. Если найдено — выведи сообщение.
  5. Дополнительно: вырежи (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);

Что изменилось:

  1. Логика:
    • Я использовал array_filter с функцией обратного вызова fn($word) для поиска запрещённых слов. Это избавляет от использования foreach и делает код более компактным.
    • Строка для результата формируется сразу, без промежуточных шагов с массивами.
    • Функция теперь сразу возвращает строку, что уменьшает количество кода и делает решение более лаконичным.
  2. Рефакторинг:
    • Заменил циклы и промежуточные переменные на более элегантное использование встроенных PHP-функций (array_filter, implode).
    • Применил стрелочные функции (Arrow Functions) для компактности.
  3. Чистота кода:
    • Улучшен формат вывода: теперь результат сразу готов к выводу в виде строки, без лишних манипуляций.
    • Добавлены комментарии для объяснения логики.

📌 Преимущества улучшений:

  • Чистота кода: Меньше строк, легче читать и поддерживать.
  • Логика: Код стал более универсальным и компактным, избавился от промежуточных массивов.
  • Производительность: Хотя изменения не сильно влияют на производительность в небольших задачах, использование array_filter позволяет избежать лишних циклов.