$companies = array( array('id' ={amp}gt; '1','name' ={amp}gt; 'Fifo Limited'), array('id' ={amp}gt; '2','name' ={amp}gt; 'FIFO Ltd'), array('id' ={amp}gt; '3','name' ={amp}gt; 'BitBytes Ltd'), array('id' ={amp}gt; '4','name' ={amp}gt; 'Info Sys'), array('id' ={amp}gt; '5','name' ={amp}gt; 'DevSquad'), array('id' ={amp}gt; '6','name' ={amp}gt; 'IT Magnet'), array('id' ={amp}gt; '7','name' ={amp}gt; 'Fifo-IT'), array('id' ={amp}gt; '8','name' ={amp}gt; 'Others') ); 

Мне нужны строки с похожими значениями — где имена совпадают на 30 percentages . Здесь ожидаемые строки будут возвращены с ID = 1, 2, 7 потому что они содержат похожее имя 'fifo' .

Я ищу решение с помощью PHP или Javascript, а также SQL, если это возможно.

Заранее спасибо!

Вы можете использовать эту функцию:

 function getSimilarities($data, $pers){ $result = []; $tmp = []; foreach($data as $ind ={amp}gt; {amp}amp;$record){ // split string by special chars '-' or ' ', array $name = preg_split('/[- ]/',$record['name']); // makes first word to lowercase $record['lowercase'] = strtolower($name[0]); // first word length $record['strlength_first'] = strlen($record['lowercase']); // string length $record['strlength_full'] = strlen($record['name']); // if length {amp}gt; 0 if ($record['strlength_full'] {amp}amp;{amp}amp; // and if length of forst word {amp}gt;= 30% string length $record['strlength_first']/$record['strlength_full'] {amp}gt;= $pers){ $input = preg_quote($record['lowercase'], '~'); if(preg_grep('~'.$input.'~', $record)) $tmp[$record['lowercase']][] = $record['id']; } } // if more than 1 = similar names foreach($tmp as $key={amp}gt;$matches){ if (count($matches){amp}gt;1){ $result[$key] = $matches; } } return $result; } $percentage = 0.3; print_r(getSimilarities($companies, $percentage)); 

Будет производить вывод, как:

 Array ( [fifo] ={amp}gt; Array ( [0] ={amp}gt; 1 [1] ={amp}gt; 2 [2] ={amp}gt; 7 ) ) 

Вы можете изменить свои входные данные и изменить процент.

демонстрация

Для этого используйте preg_quote и preg_grep .

 {amp}lt;?php $input_value = 'Fifo'; $input = preg_quote($input_value, '~'); $companies = array( array('id' ={amp}gt; '1','name' ={amp}gt; 'Fifo Limited'), array('id' ={amp}gt; '2','name' ={amp}gt; 'FIFO Ltd'), array('id' ={amp}gt; '3','name' ={amp}gt; 'BitBytes Ltd'), array('id' ={amp}gt; '4','name' ={amp}gt; 'Info Sys'), array('id' ={amp}gt; '5','name' ={amp}gt; 'DevSquad'), array('id' ={amp}gt; '6','name' ={amp}gt; 'IT Magnet'), array('id' ={amp}gt; '7','name' ={amp}gt; 'Fifo-IT'), array('id' ={amp}gt; '8','name' ={amp}gt; 'Others') ); $ids = array(); foreach($companies as $value){ $value['name']= strtolower($value['name']); if(preg_grep('~' . strtolower($input) . '~', $value)){ $ids[] = $value['id']; } } print_r($ids); exit; 

Выход:

 Array ( [0] ={amp}gt; 1 [1] ={amp}gt; 2 [2] ={amp}gt; 7 ) 

Надеюсь, это поможет вам.

Я думаю, вы можете использовать встроенную в PHP функцию Similar_text :

 $companies = array( array('id' ={amp}gt; '1','name' ={amp}gt; 'Fifo Limited'), array('id' ={amp}gt; '2','name' ={amp}gt; 'FIFO Ltd'), array('id' ={amp}gt; '3','name' ={amp}gt; 'BitBytes Ltd'), array('id' ={amp}gt; '4','name' ={amp}gt; 'Info Sys'), array('id' ={amp}gt; '5','name' ={amp}gt; 'DevSquad'), array('id' ={amp}gt; '6','name' ={amp}gt; 'IT Magnet'), array('id' ={amp}gt; '7','name' ={amp}gt; 'Fifo-IT'), array('id' ={amp}gt; '8','name' ={amp}gt; 'Others') ); $skips = []; for ($i = 0; $i {amp}lt; count($companies) - 1;   $i) { for ($j = $i; $j {amp}lt; count($companies);   $j) { if (in_array($companies[$j]['id'], $skips)) { continue; } similar_text($companies[$i]['name'], $companies[$j]['name'], $perc); if ($perc {amp}gt;= 30) { $results[$companies[$i]['id']][$companies[$j]['id']] = $companies[$j]['id']; $skips[] = $companies[$j]['id']; } } } $results = array_filter($results, function($result) { return count($result) {amp}gt; 1; }); print_r($results); 

Фрагмент кода с примером