Похоже, вы сможете добиться желаемой фильтрации с помощью цикла проверки ключевых слов без учета регистра.
Код: (демонстрация)
$allservicesname=['dance','Walk rock','Walk dance and rock','Walk']; // array of haystacks
$requestedservice='walk rock'; // string of needles
$result_array=array_filter($allservicesname,function($string)use($requestedservice){
foreach(explode(' ',$requestedservice) as $keyword){
if(stripos($string,$keyword)===false){
return false;
}
}
return true;
});
var_export($result_array);
Выход:
array (
1 => 'Walk rock',
2 => 'Walk dance and rock',
)
Обратите внимание, что исходные ключи сохраняются в выходном массиве. Кроме того, я должен отметить, что ключевые слова могут появляться в любом порядке и сохранять точность.
В качестве альтернативы, если вас не пугает идея регулярных выражений, preg_grep()
может сжато выполнить эту задачу. Это функция, предназначенная для фильтрации массивов с использованием регулярных выражений для каждого элемента.
Код: (Демо) (Демонстрация шаблона регулярных выражений)
$allservicesname=['Walk dance and rock walk','dance','walk','rock and walk','sidewalk and rockwall']; // array of haystacks
$requestedservice='walk rock'; // string of needles
$pattern='/(?=.*\Q'.str_replace(' ','\E)(?=.*\Q',$requestedservice).'\E)/i'; // with literal substring matching, no wordboundaries
//$pattern='/(?=.*\b\Q'.str_replace(' ','\E\b)(?=.*\b\Q',$requestedservice).'\E\b)/i'; // with wordboundaries
echo $pattern,"\n";
$result_array=preg_grep($pattern,$allservicesname);
var_export($result_array);
Выход:
/(?=.*\Qwalk\E)(?=.*\Qrock\E)/i
array (
0 => 'Walk dance and rock walk',
3 => 'rock and walk',
4 => 'sidewalk and rockwall',
)
Если вы не хотите, чтобы элемент [4]
квалифицировался, тогда необходимы границы слов - вместо этого используйте второе (закомментированное) объявление шаблона.
\Q..\E
гарантирует, что никакие символы со специальным значением в регулярном выражении не могут помешать выполнению. Подстроки внутри них интерпретируются «буквально».
person
mickmackusa
schedule
03.12.2017
stripos()
для каждого слова, которое может или не может быть разделено другими словами/символами. Возможно, вы захотите использовать регулярное выражение, такое какpreg_grep()
- person mickmackusa   schedule 03.12.2017walk rock
вwalk dance rock
- person Cowgirl   schedule 03.12.2017