Исходный код
foreach(explode(' ',str_replace($symbols,'',htmlspecialchars_decode(html_entity_decode(implode(' ',$keywords))))) as$i=>$val) if(mb_strlen($val)>2) echo', '.$val;
Что не так в исходном коде
В коротком фрагменте кода смешаны несколько ответственностей (знаний):
- почистить ключевые слова от лишних символов и привести к требуемому формату
- вывести ключевые слова через запятую
- не выводить ключевые слова с длиной меньше трёх символов
Кроме смешения знаний этот код содержит финт ушами: для обработки ключевых слов они сначала склеиваются в одну строку а потом обратно расклеиваются. Безусловно, так делать можно, но всё-таки не желательно, так как любой финт всегда затрудняет чтение и модификацию кода, может быть источником багов.
Вариант рефакторинга
function cleanup_keyword($keyword)
{
return str_replace(CLEANUP_SYMBOLS, '', htmlspecialchars_decode(html_entity_decode($keyword)));
}
function is_valid_keyword($keyword)
{
return mb_strlen($val) >= 3;
}
$cleaned_keywords = array_map('cleanup_keyword', $keywords);
$filtered_keywords = array_filter($cleaned_keywords, 'is_valid_keyword');
echo implode(', ', $filtered_keywords);
Безусловно, код стал длиннее, но при этом для его понимания требуется гораздо меньше умственного напряжения, а модификацию алгоритмов можно будет сделать быстрее и без багов. Не стоит думать, что одна строка кода читается быстрее, чем три строки с вызовами функций.
Обрати внимание, что условие > 2
превратилось в >= 3
. Это тоже важно, потому что для человека это условие звучит как «только ключевые слова длинной три и более символа», а значит, и в коде должна фигурировать именно цифра 3
, а не 2
. Тогда не нужно будет в голове выполнять дополнительную расшифровку ребуса > 2
в формулу «три и больше символа» — усилий на прочтение кода потребуется меньше.