2015-08-14 3 views
1

Следующий пример.Найти одну и ту же строку в нескольких строках

У меня есть массив как это:

Array 
(
    [0] => vlakke lasflenzen PN6 
    [1] => vlakke lasflenzen PN10 
    [2] => vlakke lasflenzen PN16 
    [3] => vlakke lasflenzen PN25-40 
) 

Я не знаю, что часть строк будет то же самое. И я не знаю, будет ли шаблон оставаться неизменным. Поэтому я не могу взорваться() на пробелах или что-то в этом роде.

То, что я хочу попробовать, состоит в том, чтобы извлечь часть srting, которая точно такая же между всеми четырьмя из них, но разделена между пробелами.

Итак, для этого примера мне нужно будет извлечь «vlakke lasflenzen» из четырех строк, основанных на их компаньоне.

Может ли кто-нибудь мне помочь?

ответ

3

Проблема, о которой вы говорите, также называется the longest common substring problem.

Я нашел an implementation for finding the longest common substring в массиве строк. Как уже упоминалось в исходное сообщение, использование:

<?php 
$array = array(
    'PTT757LP4', 
    'PTT757A', 
    'PCT757B', 
    'PCT757LP4EV' 
); 
echo longest_common_substring($array); 
// => T757 
?> 

Соответствующий код:

function longest_common_substring($words) 
{ 
    $words = array_map('strtolower', array_map('trim', $words)); 
    $sort_by_strlen = create_function('$a, $b', 'if (strlen($a) == strlen($b)) { return strcmp($a, $b); } return (strlen($a) < strlen($b)) ? -1 : 1;'); 
    usort($words, $sort_by_strlen); 
    $longest_common_substring = array(); 
    $shortest_string = str_split(array_shift($words)); 
    while (sizeof($shortest_string)) { 
    array_unshift($longest_common_substring, ''); 
    foreach ($shortest_string as $ci => $char) { 
     foreach ($words as $wi => $word) { 
     if (!strstr($word, $longest_common_substring[0] . $char)) { 
      // No match 
      break 2; 
     } // if 
     } // foreach 
     $longest_common_substring[0].= $char; 
    } // foreach 
    array_shift($shortest_string); 
    } 
    // If we made it here then we've run through everything 
    usort($longest_common_substring, $sort_by_strlen); 
    return array_pop($longest_common_substring); 
} 
+1

Отлично работает! Просто небольшое добавление, так как OP хочет разделить на (последнее) пространство: $ string = longest_common_substring ($ array); echo substr ($ string, 0, strrpos ($ string, '')); – sinisake

+0

Спасибо. Я также использовал google, но не знал названия проблемы, потому что мой родной язык не является английским. Благодарим за решение. – Dany

0

я, наконец, получил свой собственный solutin работать.

$names = array[ 
    'vlakke lasflenzen PN6', 
    'vlakke lasflenzen PN10', 
    'vlakke lasflenzen PN16', 
    'vlakke lasflenzen PN25-40' 
]; 

$name = []; 
$parts = []; 
foreach ($names as $name) { 
    $parts[] = array_filter(explode(' ', $name)); 
} 

foreach ($parts[0] as $index => $part) { 
     $match = true; 
     foreach ($parts as $item) { 
       if ($item[$index] !== $part) 
         $match = false; 
     } 
     if ($match) 
       $name[] = ucfirst($part); 
} 


echo implode(' ', $name); 
# Output : "Vlakke Lasflenzen" 
Смежные вопросы