2009-11-04 2 views
3
$comment = 'billie jean is not my lover she is just a girl'; 
$words = array('jean','lover','jean'); 
$lin = some_function_name($comment,$words); 
($lin=3) 

Я пробовал substr_count(), но он не работает в массиве. Есть ли встроенная функция для этого?Проверьте, находится ли массив внутри строки

+1

Должно ли 'some_function_name' возвращать сколько строк из' $ words' были сопоставлены? –

+0

Я думаю, он хочет знать, включены ли все элементы в массиве в строке? –

ответ

2

Я бы использовал array_filter(). Это будет работать в PHP> = 5.3. Для более низкой версии вам придется обрабатывать обратный вызов по-разному.

$lin = sum(array_filter($words, function($word) use ($comment) {return strpos($comment, $word) !== false;})); 
2

Это более простой подход с большим количеством строк кода:

function is_array_in_string($comment, $words) 
{ 
    $count = 0; 
    foreach ($comment as $item) 
    { 
     if (strpos($words, $item) !== false) 
      count++; 
    } 
    return $count; 
} 

array_map, вероятно, производят гораздо более чистый код.

1

array_intersect использованием & explode:

проверить все есть:

count(array_intersect(explode(" ", $comment), $words)) == count($words) 

Количество:

count(array_unique(array_intersect(explode(" ", $comment), $words))) 
+1

Неужели это излишне жрать память? (взрывая всю строку комментария.) – brianreavis

+0

, потому что мы ищем слова, я думал о преобразовании комментария $ в отдельные слова (пробел) перед поиском. В противном случае, с функциями strpos & co, «jean» будет найден в «billie jean» и «billiejean», – manji

0

Я не удивлюсь, если я downvoted для использования регулярных выражений здесь, но это однолинейный маршрут:

$hasword = preg_match('/'.implode('|',array_map('preg_quote', $words)).'/', $comment); 
0

Вы можете сделать это с помощью закрытия (работает только с PHP 5.3):

$comment = 'billie jean is not my lover she is just a girl'; 
$words = array('jean','lover','jean'); 
$lin = count(array_filter($words,function($word) use ($comment) {return strpos($comment,$word) !== false;})); 

Или более простым способом:

$comment = 'billie jean is not my lover she is just a girl'; 
$words = array('jean','lover','jean'); 
$lin = count(array_intersect($words,explode(" ",$comment))); 

Во втором способе это будет просто вернуться, если есть идеальное совпадение слов, подстроки не будут учитываться.

Смежные вопросы