2015-03-06 3 views
1

У меня есть массив значений, содержащих одно слово, и я хотел бы найти, какое из этих значений найдено первым в строке.Найти первое появление значения массива в строке

$materials = array("cotton","silk","polyester","denim","wool"); 
$string1 = "The fabric composition of this jacket is 100% cotton (body) and 65% polyester/35% cotton (lining)"; 
$string2 = "The jeans are made from denim with cotton pockets"; 

Так за $ string1, я хотел бы сказать, что он нашел «хлопок» первым в качестве материала и за $ строка2 Я хотел бы сказать, что он нашел «деним» в первую очередь.

Знаете ли вы способ сделать это? Первоначально я смотрел на петлю Еогеасп, но она будет идти по порядку массива означает, что она также принесла бы «хлопок» назад для обеих строк, как это первый один в массиве:

foreach ($materials as $material) { 
    if (stripos($string1, $material) !== FALSE) { 
     $product_material1 = $material; 
     break; 
    } 
} 
+3

* Вы знаете способ сделать это? * Вы что-то пробовали? Если да, покажите нам свои попытки, чтобы мы могли показать вам, что вы сделали неправильно, и где вы можете улучшить свой код. – Rizier123

+0

разбивает строки на массивы, используя пробел в качестве разделителя. Перекрестите свои новые значения массива с помощью $ materials. Если они что-то подходят. – floor

+0

Что мешает вам собирать начальные индексы элементов из $ materials в $ string1 и $ string2, а затем просто выбрать самый маленький? – kooker

ответ

2
$materials = array("cotton","silk","polyester","denim","wool"); 
$string1 = "The fabric composition of this jacket is 100% cotton (body) and 65% polyester/35% cotton (lining)"; 
$string2 = "The jeans are made from denim with cotton pockets"; 

$firstMatch = array_shift(array_intersect(str_word_count($string1, 1), $materials)); 
var_dump($firstMatch); 

$firstMatch = array_shift(array_intersect(str_word_count($string2, 1), $materials)); 
var_dump($firstMatch); 

Если есть не подходит, вы не получите null

Обратите внимание, что это чувствительно к регистру

+0

Я изменил его так, что строка $ string1 была в нижнем регистре, поэтому бит, чувствительный к регистру, не был проблемой: $ firstMatch = array_shift (array_intersect (str_word_count ($ string1, 1), $ materials)); Я собираюсь отметить это как ответ, поскольку это сделано именно то, что я просил поблагодарить вас !!! –

1

Мне нравится решение Марка Бейкер, потому что мне нравится один лайнеры, но здесь есть другое решение, с помощью регулярных выражений и вспомогательной функции.

function findFirst($haystack, $needles) { 
    if (preg_match('/'.implode('|', $needles).'/', $haystack, $matches)) { 
     return $matches[0]; 
    } 

    return null; 
} 

$first1 = findFirst($string1, $materials); 
var_dump($first1); 

$first2 = findFirst($string2, $materials); 
var_dump($first2);