3v4l.org

run code in 300+ PHP versions simultaneously
<?php function translitUa($str) { $array = [ //'&'=>'ta', //'%'=>'', //'\''=>'', 'Зг'=>'Zgh', 'зг'=>'zgh', 'А'=>'A','а'=>'a', 'Б'=>'B','б'=>'b', 'В'=>'V','в'=>'v', 'Г'=>'H','г'=>'h', 'Ґ'=>'G','ґ'=>'g', 'Д'=>'D','д'=>'d', 'Е'=>'E','е'=>'e', 'Є'=>'Ye','є'=>'ie', 'Ж'=>'Zh','ж'=>'zh', 'З'=>'Z','з'=>'z', 'И'=>'Y','и'=>'y', 'І'=>'I','і'=>'i', 'Ї'=>'Yi','ї'=>'i', 'Й'=>'Y','й'=>'i', 'К'=>'K','к'=>'k', 'Л'=>'L','л'=>'l', 'М'=>'M','м'=>'m', 'Н'=>'N','н'=>'n', 'О'=>'O','о'=>'o', 'П'=>'P','п'=>'p', 'Р'=>'R','р'=>'r', 'С'=>'S','с'=>'s', 'Т'=>'T','т'=>'t', 'У'=>'U','у'=>'u', 'Ф'=>'F','ф'=>'f', 'Х'=>'Kh','х'=>'kh', 'Ц'=>'Ts','ц'=>'ts', 'Ч'=>'Ch','ч'=>'ch', 'Ш'=>'Sh','ш'=>'sh', 'Щ'=>'Shch','щ'=>'shch', 'Ь'=>'','ь'=>'', 'Ю'=>'Yu','ю'=>'iu', 'Я'=>'Ya','я'=>'ia' ]; return strtr($str,$array); } function wordcombos($words) { if ( count($words) <= 1 ) { $result = $words; } else { $result = array(); for ( $i = 0; $i < count($words); ++$i ) { $firstword = $words[$i]; $remainingwords = array(); for ( $j = 0; $j < count($words); ++$j ) { if ( $i <> $j ) $remainingwords[] = $words[$j]; } $combos = wordcombos($remainingwords); for ( $j = 0; $j < count($combos); ++$j ) { $result[] = $firstword . ' ' . $combos[$j]; } } } return $result; } function wordsArray($words, $data, $array = []) { if ($words === []) { return $array; } $word = array_shift($words); $subArray = wordsArray($words, $data, $array); if ($subArray === []) { $array[metaphone(translitUa($word))]['@data'] = $data; } else { $array[metaphone(translitUa($word))] = $subArray; } return $array; } $matches = [ 'розклад маршруток київ' => 'ось розклад маршруток київ', 'розклад автобусів київ' => 'ось розклад маршруток київ', 'розклад маршруток клавдієво' => 'ось розклад маршруток клавдієво', 'розклад автобусів клавдієво' => 'ось розклад маршруток клавдієво', 'розклад маршруток макарів' => 'ось розклад маршруток макарів', 'розклад автобусів макарів' => 'ось розклад маршруток макарів', 'розклад макарів' => 'ось розклад маршруток макарів', 'розклад електричок київ' => 'ось розклад електричок київ', 'розклад електричок' => 'ось розклад електричок київ', 'розклад електричок святошин' => 'ось розклад електричок київ', ]; function generateArray($matches) { $array = []; foreach ($matches as $keywords => $match) { $keywordsArray = explode(' ', $keywords); $combinations = wordcombos($keywordsArray); foreach ($combinations as $combination) { $words = explode(' ', $combination); $array = array_merge_recursive($array, wordsArray($words, $match)); } } return $array; } $array = generateArray($matches); function search($query, $array) { $query = str_replace([',', '.', ';', '-', '!', '?', "\r\n", "\n"], ' ', $query); $queryWords = explode(' ', $query); foreach ($queryWords as $word) { $wordMeta = metaphone(translitUa($word)); foreach ($array as $key => $value) { if (levenshtein($wordMeta, $key) < 2) { $array = $array[$key]; //var_dump($word . ' - ' . $wordMeta, $array); break; } } } if (isset($array['@data'])) { var_dump($array['@data']); } } search('Ну Це хоч по ділу.. а не 200 повідомлень дайте розклад електричок чи маршрутки', $array);
Output for 7.4.0 - 7.4.33, 8.0.1 - 8.0.26, 8.1.0 - 8.1.13, 8.2rc1 - rc3
string(51) "ось розклад електричок київ"

preferences:
21.66 ms | 409 KiB | 5 Q