2015-02-27 1 views
3

Я хочу проверить, существуют ли ВСЕ слова из $ words в одном или нескольких $ предложениях, порядок слов не важен.PHP strpos соответствует всем иглам в нескольких стогах сена

Слова будут содержать только [a-z0-9].

Предложения будут содержать только [a-z0-9-].

Мой код до сих пор, почти работает, как ожидалось:

$words = array("3d", "4"); 
$sentences = array("x-3d-abstract--part--282345", "3d-speed--boat-430419", "beautiful-flower-462451", "3d-d--384967"); 

foreach ($words as $word) { 
    $sentences_found = array_values(array_filter($sentences, function($find_words) use ($word) {return strpos($find_words, $word);})); 
} 
print_r($sentences_found); 

Если запустить этот код здесь http://3v4l.org/tD5t5, вы получите 4 результаты, но в действительности это должно быть 3 результаты

Array 
(
    [0] => x-3d-abstract--part--282345 
    [1] => 3d-speed--boat-430419 
    [2] => beautiful-flower-462451 // this one is wrong, no "3d" in here, only "4" 
    [3] => 3d-d--384967 
) 

Как я могу это сделать?

Также есть ли лучший способ сделать это, чем strpos?

Regex?

Regex, возможно, медленный для этой работы, потому что иногда будет 1000 $ предложений (не спрашивайте почему).

+1

huh? Я запускаю ваши коды, результат 'print_r()' is: 'Array ( [0] => this-is-simple-simple-sentence-123-aa99-311qwerty )' вместо 3 элементов – Raptor

+0

вы уверены об этом? Я получаю все 3 результата с помощью print_r() – Sunny

+1

@ Сонные работы также для меня! (См.: Http://3v4l.org/b2AoN) – Rizier123

ответ

1

Вы можете использовать пересечение найденных предложений на слово:

$found = array(); 

foreach ($words as $word) { 
    $found[$word] = array_filter($sentences, function($sentence) use ($word) { 
     return strpos($sentence, $word) !== false; 
    }); 
} 

print_r(call_user_func_array('array_intersect', $found)); 

Или, подход от $sentences:

$found = array_filter($sentences, function($sentence) use ($words) { 
    foreach ($words as $word) { 
     if (strpos($sentence, $word) === false) { 
      return false; 
     } 
    } 
    // all words found in sentence 
    return true; 
}); 

print_r($found); 

Одна важная вещь, чтобы отметить, что ваши критерии поиска не так; вместо strpos($sentence, $word) вы должны явно сравнить с false, иначе вы пропустите матч в начале предложения.

+1

потрясающая работа! tyvm работает отлично, я пробовал различные комбинации, и все в порядке, я дам вам самый большой взлет! :) – Sunny