У меня есть массив PHP, насчитывающий около 20 000 имен, мне нужно отфильтровать его и удалить любое имя, в котором есть слово job
, freelance
или project
.
Ниже приводится то, что я начал до сих пор, он будет циклически проходить через массив и добавлять очищенный элемент для создания нового чистого массива. Мне нужна помощь, соответствующая «плохим» словам. Пожалуйста, помоги, если можешь
$data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname'); // freelance // job // project $cleanArray = array(); foreach ($data1 as $name) { # if a term is matched, we remove it from our array if(preg_match('~\b(freelance|job|project)\b~i',$name)){ echo 'word removed'; }else{ $cleanArray[] = $name; } }
Прямо сейчас это соответствует слову, поэтому, если «внештатный» – это имя в массиве, оно удаляет этот элемент, но если это что-то вроде ImaFreelaner
то это не так, мне нужно удалить все, что имеет в нем соответствующие слова
Регулярное выражение здесь действительно не требуется – скорее всего, будет быстрее использовать несколько вызовов stripos
. (Эффективность имеет значение на этом уровне, потому что поиск происходит для каждого из 20 000 имен.)
С array_filter
, который сохраняет только элементы в массиве, для которых обратный вызов возвращает true
:
$data1 = array_filter($data1, function($el) { return stripos($el, 'job') === FALSE && stripos($el, 'freelance') === FALSE && stripos($el, 'project') === FALSE; });
Вот более расширяемая / поддерживаемая версия, где список плохих слов можно загружать из массива, а не явно указывать в коде:
$data1 = array_filter($data1, function($el) { $bad_words = array('job', 'freelance', 'project'); $word_okay = true; foreach ( $bad_words as $bad_word ) { if ( stripos($el, $bad_word) !== FALSE ) { $word_okay = false; break; } } return $word_okay; });
Я был бы склонен использовать функцию array_filter и изменять регулярное выражение, чтобы оно не соответствовало границам слов
$data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname'); $cleanArray = array_filter($data1, function($w) { return !preg_match('~(freelance|project|job)~i', $w); });
Использование функции preg_match()
и некоторых регулярных выражений должно делать трюк; это то, что я придумал, и это сработало хорошо на моей стороне:
<?php $data1=array('JoomlaFreelance','PhillyWebJobs','web2project','cleanname'); $cleanArray=array(); $badWords='/(job|freelance|project)/i'; foreach($data1 as $name) { if(!preg_match($badWords,$name)) { $cleanArray[]=$name; } } echo(implode($cleanArray,',')); ?>
Что вернулось:
cleanname
Лично я бы сделал что-то вроде этого:
$badWords = ['job', 'freelance', 'project']; $names = ['JoomlaFreelance', 'PhillyWebJobs', 'web2project', 'cleanname']; // Escape characters with special meaning in regular expressions. $quotedBadWords = array_map(function($word) { return preg_quote($word, '/'); }, $badWords); // Create the regular expression. $badWordsRegex = implode('|', $quotedBadWords); // Filter out any names that match the bad words. $cleanNames = array_filter($names, function($name) use ($badWordsRegex) { return preg_match('/' . $badWordsRegex . '/i', $name) === FALSE; });
Это должно быть то, что вы хотите:
if (!preg_match('/(freelance|job|project)/i', $name)) { $cleanArray[] = $name; }