2015-10-09 2 views
-2

Так вот ситуация давайте представим строку и массив:Учитывая строку и массив строк проверить, если строка содержит все слова в массиве

$str = 'Sample string'; 
$arr = array('sample', 'string') 

Что бы быть лучшим способом, чтобы определить, является ли данная строка содержит все слова, содержащиеся в массиве? Строка может быть длиннее и имеет дополнительные слова, это не имеет значения. Единственная вещь, в которой я нуждаюсь, - это функция, которая задает строку, и массив возвращает true, если строка содержит каждое отдельное слово, которое находится в массиве (случай и порядок, в котором они отображаются, не имеет значения)

+1

Разделить строку в массив слов с использованием str_word_count(), array_walk что массив принуждая в нижнем регистре, а затем использовать array_intersect() –

ответ

1

Попробуйте это вне.

$strArray = explode(" ", $str); 
$result = array_intersect($strArray, $arr); 
if(sizeof($result) == sizeof($arr)){ 
    return TRUE; 
}else{ 
    return FALSE; 
} 

, если это не сработает, то попробуйте поменять местами входы в array_intersect($arr, $strArray) Вы можете добавить другие функции, чтобы сделать все в нижнем регистре, прежде чем сравнивать, чтобы дать ему штрихом.

+0

требует двух параметров. –

+0

Извините, исправлена. –

1

Вы можете просто использовать str_word_count с дополнительным параметром 1 вроде как

$str = 'Sample string'; 
$arr = array('sample', 'string'); 
$new_arr = array_intersect(array_map('strtolower',str_word_count($str,1)),$arr); 
print_r($new_arr); 

Выход:

Array 
(
    [0] => sample 
    [1] => string 
) 

Demo

1

Попробуйте это:

<?php 
$words = array('sample', 'string'); 
$str = 'sample string'; 
strtolower($str); 
$strArr = explode(' ',$str); 
$wordfound = false; 
foreach ($strArr as $k => $v) { 
    if (in_array($v,$words)) {$wordfound = true; break;} 
    foreach($words as $kb => $vb) { 
     if (strstr($v, $kb)) $wordfound = true; 
     break; 
    } 
} 
if ($wordfound) { 
    echo 'Found!'; 
} 
else echo 'Not found!'; 
1

Если производительность имеет значение, я хотел бы использовать ассоциативный массив:

$words = array_flip(preg_split('/\\s+/', strtolower($str))); 
$result = true; 
foreach ($arr as $find) { 
    if (!isset($words[$find])) { 
     $result = false; 
     break; 
    } 
} 

Demo

0
$str = 'Sample string'; 
$str1=strtolower($str); 


$arr = array(
      'sample', 
      'string' 
     ); 

     foreach($arr as $val) 
     { 
      if(strpos($str1,strtolower($val)) !== false) 
      { 
       $msg='true'; 
      } 
      else 
      { 
       $msg='false'; 
       break; 
      } 
     } 

    echo $msg; 
Смежные вопросы